1

도와 드리겠습니다. 나는이 문서를 어디서나 찾을 수 없다. Android 앱 WRITE_EXTERNAL_STORAGE에서 런타임 권한을 요청하고 있습니다.권한 N 허용 앱이 앱을 죽이는 것을 허용합니다.

Android M에서 예상대로 작동합니다. 나는 '허용'을 누르고 모두 괜찮습니다. Android N에서 '허용'을 클릭하면 내 앱이 종료됩니다. 충돌하지 않고 정지합니다. 로그 캣에서

그것은

Killing 6599:com.myname.myappname/u0a223 (adj 100): permission grant or revoke changed gids 
Force removing ActivityRecord{c834991 u0 com.myname.myappname/.MainActivity t1814}: app died, no saved state 
Destroying surface Surface(name=Window{bf01619 u0 com.myname.myappname/com.myname.myappname.MainActivity}) called by com.android.server.wm.WindowStateAnimator.destroySurface:-1 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:-1 com.android.server.wm.WindowState.removeLocked:-1 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:-1 com.android.server.wm.WindowManagerService.removeWindowLocked:-1 com.android.server.wm.WindowManagerService.removeWindowLocked:-1 com.android.server.wm.AppWindowToken.removeAllWindows:-1 com.android.server.wm.AppWindowToken.removeAppFromTaskLocked:-1 

내가 발견 '권한 부여 또는 변경 GID를 취소'PackageManagerService.java

private static final String KILL_APP_REASON_GIDS_CHANGED = "permission grant or revoke changed gids"; 

그리고

final int result = permissionsState.grantRuntimePermission(bp, userId); 
     switch (result) { 
      case PermissionsState.PERMISSION_OPERATION_FAILURE: { 
       return; 
      } 

      case PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: { 
       mHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         killSettingPackagesForUser(sb, userId, KILL_APP_REASON_GIDS_CHANGED); 
        } 
       }); 
에서 안드로이드 소스 코드를 살펴보면 보여줍니다

잘 작동하는 데 사용 된 응용 프로그램 코드는 다음과 같습니다.

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

그리고

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

    if (requestCode == 1) { 

     // If request is cancelled, the result arrays are empty. 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // do stuff 
     } 

앱을 살해하는 이유 누군가가 나에게 설명 할 수 있습니까? 프로그래밍 방식으로 앱을 다시 시작하려면 어떻게 잡을 수 있을까요?

+0

어떤 API 수준을 점검하고 있습니까? 'API 레벨 23 '아래에서는 런타임 권한을 요청하지 않습니다. – Piyush

+0

내 생각 엔이 장치의 버그입니다. 사용자가 설정에서 권한을 취소하면 프로세스가 종료되지만 앱이나 설정에서 'requestPermissions()'에 의해 트리거되는지 여부에 관계없이 사용자가 권한을 부여하면 종료되지 않아야합니다. 런타임 권한을 요구하는 기존 코드를 사용해보십시오. 예를 들어, [내 책] (https://commonsware.com/Android)의 런타임 권한을 사용하는 샘플 앱 (예 : [this one] (https://github.com/commonsguy/cw-omnibus/tree/) 마스터/권한/자습서/마침/RuntimePermTutorial))에서 설명하는 동작을 보여줍니다. – CommonsWare

+0

@Piyush Correct. 이것은 API 레벨 25에 대한 런타임 권한을 요청할 때 발생합니다. –

답변

-1

나는이 똑같은 문제에 직면했으며, Android Manifest의 액티비티 태그에서 android:noHistory="true"을 제거하고 모두 올바르게 작동합니다.

관련 문제