1. 程式人生 > >【舉例】Android動態申請許可權

【舉例】Android動態申請許可權

寫在前面:對於新版本的Android,部分許可權必須手動向使用者發起請求並獲得允許後才能使用。關於這一部分的基礎知識,這裡就不詳述。大家可以自行百度去獲取。

相關知識:
【舉例】Android自定義Dialog——做出“確定/取消”的選擇

http://blog.csdn.net/u013806583/article/details/62896506


還是一貫的風格,直接上程式碼。

1. 與舊版本一樣,所有需要的許可權需要手動宣告

    <uses-permission android:name="android.permission.CAMERA"
/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET"
/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在這些許可權中,CAMERA 、RECORD_AUDIO 和 WRITE_EXTERNAL_STORAGE 需要動態申請。

2. 動態申請許可權

//一個整形常量
public static final int MY_PERMISSIONS_REQUEST = 3000
; //定義一個list,用於儲存需要申請的許可權 ArrayList<String> permissionList = new ArrayList<String>(); permissionList.add(Manifest.permission.CAMERA); permissionList.add(Manifest.permission.RECORD_AUDIO); permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); //呼叫封裝好的申請許可權的方法 private void checkAndRequestPermissions(ArrayList<String> permissionList) { ArrayList<String> list = new ArrayList<>(permissionList); Iterator<String> it = list.iterator(); while (it.hasNext()) { String permission = it.next(); //檢查許可權是否已經申請 int hasPermission = ContextCompat.checkSelfPermission(this, permission); if (hasPermission == PackageManager.PERMISSION_GRANTED) { it.remove(); } } /** *補充說明:ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO); *對於原生Android,如果使用者選擇了“不再提示”,那麼shouldShowRequestPermissionRationale就會為true。 *此時,使用者可以彈出一個對話方塊,向用戶解釋為什麼需要這項許可權。 *對於一些深度定製的系統,如果使用者選擇了“不再提示”,那麼shouldShowRequestPermissionRationale永遠為false * */ if (list.size() == 0) { return; } String[] permissions = list.toArray(new String[0]); //正式請求許可權 ActivityCompat.requestPermissions(this, permissions, AppConstant.MY_PERMISSIONS_REQUEST); }

3. 在本Activity中重寫 onRequestPermissionsResult() 方法

    //不管許可權申請成功與否,都會呼叫該方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case AppConstant.MY_PERMISSIONS_REQUEST: {
                // If request is cancelled, the result arrays are empty.
                int length = grantResults.length;
                boolean re_request = false;//標記位:如果需要重新授予許可權,true;反之,false。
                for (int i = 0; i < length; i++) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        Log.d(TAG, "許可權授予成功:" + permissions[i]);
                    } else {
                        Log.e(TAG, "許可權授予失敗:" + permissions[i]);
                        re_request = true;
                    }
                }
                if (re_request) {
                    //彈出對話方塊,提示使用者重新授予許可權
                    //關於彈出自定義對話方塊,可以檢視本博文開頭的知識擴充套件
                    final YesOrNoDialog permissionDialog = new YesOrNoDialog(mContext);
                    permissionDialog.setCanceledOnTouchOutside(false);
                    permissionDialog.setMeesage("請授予相關許可權,否則程式無法執行。\n\n點選確定,重新授予許可權。\n點選取消,立即終止程式。\n");
                    permissionDialog.setCallback(new YesOrNoDialog.YesOrNoDialogCallback() {
                        @Override
                        public void onClickButton(YesOrNoDialog.ClickedButton button, String message) {
                            if (button == YesOrNoDialog.ClickedButton.POSITIVE) {
                                permissionDialog.dismiss();
                                //此處需要彈出手動修改許可權的系統介面
                                checkAndRequestPermissions(permissionList);
                            } else if (button == YesOrNoDialog.ClickedButton.NEGATIVE) {
                                permissionDialog.dismiss();
                                TestActivity.this.finish();
                            }
                        }
                    });

                    permissionDialog.show();
                }
                break;
            }
            default:
                break;
        }
    }

抓住Demo一隻:

為了方便以後呼叫,本人已經將上述方法封裝到了.aar檔案中。以後呼叫時,只需要匯入第三方包即可。

https://github.com/shanxu100/GUtils

歡迎大家補充交流。