Android动态申请多个权限-非第三方框架

Posted Jason_Lee155

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android动态申请多个权限-非第三方框架相关的知识,希望对你有一定的参考价值。

最近在做一个项目,需要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 = 0x10;//权限请求码

第四步:这是最重要的一步,进行权限判断和申请,其中的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){//如果有没有被允许的权限
            showWaringDialog();
        }else {
            //权限已经都通过了,可以将程序继续打开了
            init();
        }
    }

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

    /**
     * 警告弹窗
     */
    private void showWaringDialog() {
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("警告!")
                .setMessage("请前往设置->应用->phone->权限中打开相关权限,否则功能无法正常运行!")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 一般情况下如果用户不授权的话,功能是无法运行的,做退出处理
                        finish();
                    }
                }).show();
    }

以上是关于Android动态申请多个权限-非第三方框架的主要内容,如果未能解决你的问题,请参考以下文章

Android6.0------权限申请RxPermissions

Android6.0------权限申请~easypermissions

通过AOP的思想 打造万能动态权限申请框架Demo完全解析

android动态申请权限步骤

Android 批量申请权限

Android 应用开发动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )