每日一记—Android动态申请多个权限

日期:2018.9.10


最近在做一个小项目,使用到了Android权限申请,而且是多个权限申请,我们知道在Android6.0(SDK等级是23)以后有些权限是需要动态申请的,所以也就是申请多个动态权限的问题。

直奔主题,我申请的权限有四个:READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,CAMERA,INTERNET,虽然是动态申请,但是还是需要在AndroidManifest.xml文件中进行静态申请的(特别提示,权限申请要放在application之前):

    
    
    
    

然后是动态权限申请,第一步:首先声明一个数组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  mPermissionList = new ArrayList<>();

第三步:声明一个请求码,在请求权限的回调方法onRequestPermissionsResult中需要判断使用

private final int mRequestCode = 100;//权限请求码

第四步:这是最重要的一步,进行权限判断和申请,其中的init是我自己程序里的一些初始化,即权限全部申请了,就可以打开程序了。

//4、权限判断和申请
    private void initPermission(){
        mPermissionList.clear();//清空已经允许的没有通过的权限
        //逐个判断是否还有未通过的权限
        for (int i = 0;i0){//有权限没有通过,需要申请
            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

第六步:不再提示权限时的展示对话框

/**
     *  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();
    }

 


下面是效果展示:

这是第一个需要申请的权限

每日一记—Android动态申请多个权限_第1张图片

然后是第二个需要申请的权限

每日一记—Android动态申请多个权限_第2张图片

全部点击始终允许后,就可以进入主界面了

每日一记—Android动态申请多个权限_第3张图片

如果有点击禁止的权限,就会出现如下界面,如果选择设置就会弹出系统设置界面,进行权限设置,如果点击取消,就会退出程序。

每日一记—Android动态申请多个权限_第4张图片

点击设置后出现如下设置界面

每日一记—Android动态申请多个权限_第5张图片

最后,细心的大佬们应该能看出来,我申请了四个权限,却只有两个出现在动态申请里,这说明有另外两个不需要动态申请,但是我把所有权限都放在动态申请里也没有毛病~~


华丽丽的结束了


 

你可能感兴趣的:(每日一记)