每日一記—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();
    }

 


下面是效果展示:

這是第一個需要申請的權限

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

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

如果有點擊禁止的權限,就會出現如下界面,如果選擇設置就會彈出系統設置界面,進行權限設置,如果點擊取消,就會退出程序。

點擊設置後出現如下設置界面

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


華麗麗的結束了


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章