Android動態申請Camera許可權應用閃退問題
問題:客戶反饋他們應用第一次開啟申請相機許可權,應用退出,需要第二次開啟。 分析:先寫一個簡單的應用測試下 測試結果: 應用在申請完相機許可權之後確實會被系統殺掉,日誌中打瞭如下日誌 Killing 8269:com.example.android.camera2basic/u0a85 (adj 100): permission grant or revoke changed gids(偷懶往下下載了一個相機的demo) 研究程式碼發現如下的邏輯:
final int result = permissionsState.grantRuntimePermission(bp, userId); switch (result) { case PermissionsState.PERMISSION_OPERATION_FAILURE: { return; } case PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED: { final int appId = UserHandle.getAppId(pkg.applicationInfo.uid); mHandler.post(new Runnable() { @Override public void run() { killUid(appId, userId, KILL_APP_REASON_GIDS_CHANGED); } }); } break;
PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED是個什麼東西?
這個flag表示許可權授予成功,但是應用的gids改變了,那麼就好理解了,因為申請了camera的許可權,所以應用的gids改變了,系統認為gids變了就要殺掉應用(系統還有類似的邏輯,比如清除app資料也會導致應用被殺) 我們去frameworks/base/data/etc/platform.xm中看看 <permission name="android.permission.CAMERA" > <group gid="camera" /> </permission> 原來申請了CAMERA的許可權之後就會把該應用加入camera組 再看看其他的許可權 <permission name="android.permission.READ_EXTERNAL_STORAGE" /> <permission name="android.permission.WRITE_EXTERNAL_STORAGE" /> 讀寫內部儲存是沒有引起組變化的 <permission name="android.permission.INTERNET" > <group gid="inet" /> </permission> 網路許可權也會引起組變化,可是網路許可權不用動態申請,所以沒有這個問題