1. 程式人生 > >每日一記—Android動態申請多個許可權

每日一記—Android動態申請多個許可權

日期:2018.9.10

最近在做一個小專案,使用到了Android許可權申請,而且是多個許可權申請,我們知道在Android6.0(SDK等級是23)以後有些許可權是需要動態申請的,所以也就是申請多個動態許可權的問題。

直奔主題,我申請的許可權有四個:READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,CAMERA,INTERNET,雖然是動態申請,但是還是需要在AndroidManifest.xml檔案中進行靜態申請的(特別提示,許可權申請要放在application之前):

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.INTERNET"/>

然後是動態許可權申請,第一步:首先宣告一個數組permissions,將所有需要申請的許可權都放在裡面

//1、首先宣告一個數組permissions,將所有需要申請的許可權都放在裡面
    String[] permissions = new String[]{Manifest.permission.CAMERA,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.INTERNET};

第二步:建立一個mPermissionList,逐個判斷哪些許可權未授權,將未授權的許可權儲存到mPermissionList中

List<String>  mPermissionList = new ArrayList<>();

第三步:宣告一個請求碼,在請求許可權的回撥方法onRequestPermissionsResult中需要判斷使用

private final int mRequestCode = 100;//許可權請求碼

第四步:這是最重要的一步,進行許可權判斷和申請,其中的init是我自己程式裡的一些初始化,即許可權全部申請了,就可以開啟程式了。

//4、許可權判斷和申請
    private void initPermission(){
        mPermissionList.clear();//清空已經允許的沒有通過的許可權
        //逐個判斷是否還有未通過的許可權
        for (int i = 0;i<permissions.length;i++){
            if (ContextCompat.checkSelfPermission(this,permissions[i])!=
                    PackageManager.PERMISSION_GRANTED){
                mPermissionList.add(permissions[i]);//新增還未授予的許可權到mPermissionList中
            }
        }
        //申請許可權
        if (mPermissionList.size()>0){//有許可權沒有通過,需要申請
            ActivityCompat.requestPermissions(this,permissions,mRequestCode);
        }else {
            //許可權已經都通過了,可以將程式繼續打開了
            init();
        }
    }

第五步:請求許可權後回撥的方法,這步是在許可權請求完成後做個判斷,是否完成了所有許可權的申請,如果有沒有同意的許可權申請,自動跳轉到系統設定介面或者退出,注意這裡我也使用了一次init,目的是如果是第四步中的mPermissionList.size()>0,那麼將不會執行第四步裡的init(),也就是不會開啟程式,而是卡在了申請許可權的介面。

 /**
     * 5.請求許可權後回撥的方法
     * @param requestCode 是我們自己定義的許可權請求碼
     * @param permissions 是我們請求的許可權名稱陣列
     * @param grantResults 是我們在彈出頁面後是否允許許可權的標識陣列,陣列的長度對應的是許可權
     *                     名稱陣列的長度,陣列的資料0表示允許許可權,-1表示我們點選了禁止許可權
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        boolean hasPermissionDismiss = false;//有許可權沒有通過
        if (mRequestCode==requestCode){
            for (int i=0;i<grantResults.length;i++){
                if (grantResults[i]==-1){
                    hasPermissionDismiss=true;
                    break;
                }
            }
        }
        if (hasPermissionDismiss){//如果有沒有被允許的許可權
            showPermissionDialog();
        }else {
            //許可權已經都通過了,可以將程式繼續打開了
            init();
        }
    }

第六步:不再提示許可權時的展示對話方塊

/**
     *  6.不再提示許可權時的展示對話方塊
     */
    AlertDialog mPermissionDialog;
    String mPackName = "crazystudy.com.crazystudy";

    private void showPermissionDialog() {
        if (mPermissionDialog == null) {
            mPermissionDialog = new AlertDialog.Builder(this)
                    .setMessage("已禁用許可權,請手動授予")
                    .setPositiveButton("設定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            cancelPermissionDialog();

                            Uri packageURI = Uri.parse("package:" + mPackName);
                            Intent intent = new Intent(Settings.
                                    ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                            startActivity(intent);
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //關閉頁面或者做其他操作
                            cancelPermissionDialog();
                            SplashActivity.this.finish();
                        }
                    })
                    .create();
        }
        mPermissionDialog.show();
    }

第七步:關閉對話方塊

    private void cancelPermissionDialog() {
        mPermissionDialog.cancel();
    }

下面是效果展示:

這是第一個需要申請的許可權

然後是第二個需要申請的許可權

全部點選始終允許後,就可以進入主介面了

如果有點選禁止的許可權,就會出現如下介面,如果選擇設定就會彈出系統設定介面,進行許可權設定,如果點選取消,就會退出程式。

點選設定後出現如下設定介面

最後,細心的大佬們應該能看出來,我申請了四個許可權,卻只有兩個出現在動態申請裡,這說明有另外兩個不需要動態申請,但是我把所有許可權都放在動態申請裡也沒有毛病~~

華麗麗的結束了