1. 程式人生 > >Android動態申請Camera許可權應用閃退問題

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>         網路許可權也會引起組變化,可是網路許可權不用動態申請,所以沒有這個問題