0

API 23 이상의 Android 기기의 경우 앱을 다시 시작하지 않고 외부 저장 용량 권한을 부여 할 수 있습니다 (단일 세션 내 Google 뮤직 라이브러리에 Google 뮤직 라이브러리를 업로드하는 것과 같은 종류) ? 나는이 문제가 여기에 몇 번 언급되었지만 지금까지 행운을 찾지 못한다는 것을 알고있다. 여기 앱을 다시 시작하지 않고 외부 저장 용량 권한 부여

내 매니페스트 파일의 권한은 다음과 같습니다

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

MainActivity :

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23 
     if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); 

      return; // Included here to prevent the app from crashing. 
     } 
    } 

    /** 
    * CODE HERE FOR INSTANTIATIONS AND SUCH. 
    */ 
} 
... 지금, 나는이 권한을 이동하는 응용 프로그램을 다시 시작해야 할 것 때문에 (및 MainActivity의 인스턴스화 등) 이후 초기 팝업에서 권한을 수락합니다.

감사합니다.

@CommonsWare 제안으로
+2

"권한이 통과하려면 앱을 다시 시작해야합니다."- 그렇지 않습니다. 여기에서 불안정한 경우에는 코드를 이동하십시오. " 다른 방법으로. 해당 시점에 이미 권한이있는 경우 해당 메소드를'onCreate()'에서 호출하십시오. 또한 사용자가 해당 권한에 동의하면 해당 메소드를'onRequestPermissionsResult()'에서 호출하십시오. 예를 들어 [이 샘플 프로젝트] (https://github.com/commonsguy/cw-omnibus/tree/master/Files/FilesEditor)를 참조하십시오. – CommonsWare

답변

1

, 당신은 instantiateMyObjects() 같은 방법으로 인스턴스화 및을 수행하는 모든 코드를 넣어에서 그것을 호출 할 수 onCreate()

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23 
     if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_CODE); 
      // Define the constant MY_PERMISSION_CODE. 

      return; // Included here to prevent the app from crashing. 
     } 
    } 

    instantiateMyObjects(); 
} 

그리고 사용자가 수락 할 때/당신의 권한 요청을 거부

같은 onRequestPermissionsResult()이 호출됩니다. 예를 들어 MY_PERMISSION_CODE1으로 지정하는 것을 잊지 마십시오.

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 

    if (requestCode == MY_PERMISSION_CODE) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Now you can instantiate your objects. 
      instantiateMyObjects(); 
     } else { 
      // User denied it. 
     } 
    } 
} 
관련 문제