お役に立てれば幸いです。これに関するドキュメントはどこにも見つかりません。Android アプリ WRITE_EXTERNAL_STORAGE でランタイム許可をリクエストしています。
Android M では、これは期待どおりに機能します。「許可」を押すと、すべて問題ありません。Android N で [許可] をクリックするとアプリが強制終了されます。クラッシュするのではなく、停止するだけです。
logcatでそれが示しています
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
Android のソース コードを見ると、PackageManagerService.java で「許可を付与するか、変更された gid を取り消す」ことがわかりました。
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
}
アプリが強制終了された理由を説明できる人はいますか? そして、プログラムでアプリを再起動するためにそれをキャッチする方法はありますか?