如何一次性获取多个动态权限

转载自获取多个动态权限

    android6.0及以上版本区分了:普通权限和危险权限。普通权限可以直接在清单文件里面申请,
    危险权限不仅要在清单文件里面申请,还要在代码里面动态获取。如果你仅仅动态获取了,
    没有在清单文件里面申明,在你返回的回调方法里面会被拒绝给权限。
    我这里的思路就是,先判断版本号是否大于android6.0,
    然后判断你的操作需要的权限哪些是没有给的,没有给的就去动态获取,给了的就不用
    接着,弹出对话框提示用户,需要这些权限的原因,让用户去选择,是否给该权限
    最后,系统也会弹出一个对话框,让用户去确认,是否给权限。
    注意:如果这里,我们自己的对话框,用户选择了是,然后没有弹系统的对话框让用户去选择,
    就直接被拒绝了,那就是前面我说过的,在清单文件里面没有注册该权限。
    这里,我以拍照为例。调用方式如下:

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
String[] permission = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};//需要的权限
        String title = "相机权限不可用";
        String content = "由于上传照片需要获取相机相关权限,获取相册功能;\n否则,您将无法正常使用相机功能";
        initPermission(permission,title,content);
    
    
  • 1
  • 2
  • 3
  • 4
    1、首先:判断版本号是否大于android6.0for循环判断哪些需要获取的权限

    
    
  • 1
  • 2
    /**
     * 初始化用户权限
     * @param permissions 需要的权限
     * @param title 我们自己对话框的标题
     * @param content 我们自己对话框的内容
     */
    public void initPermission(String[] permissions, String title, String content) {
        // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> permissionList = new ArrayList<>();
            for (int i = 0; i < permissions.length; i++) {//for循环把需要授权的权限都添加进来
                if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) {  //未授权就进行授权
                    permissionList.add(permissions[i]);
                }
            }
            //如果permissionList是空的,说明没有权限需要授权,什么都不做,该干嘛干嘛,否则就发起授权请求
            if (!permissionList.isEmpty()) {
                showDialogTipUserRequestPermission(permissionList, title, content);
            }
        }
    }
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
    2、弹出对话框,让用户选择是否给权限

    
    
  • 1
  • 2
// 提示用户该请求权限的弹出框
    private void showDialogTipUserRequestPermission(final List<String> permissionList, String title, String content) {
        new android.support.v7.app.AlertDialog.Builder(this)
                .setTitle(title)
                .setMessage(content)
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startRequestPermission(permissionList);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).setCancelable(false).show();
    }
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
    3、提交权限的请求

    
    
  • 1
  • 2
// 开始提交请求权限
    private void startRequestPermission(List<String> permissionList) {
        if (!permissionList.isEmpty()) {//不为空就进行授权申请
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(this, permissions, permissionsRequestCode);
        }
    }
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
    4、回调方法

    
    
  • 1
  • 2
// 用户权限 申请 的回调方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == permissionsRequestCode) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults.length > 0) {//安全写法,如果小于0,肯定会出错了
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        switch (grantResult){
                            case PackageManager.PERMISSION_GRANTED://同意授权0
                                break;
                            case PackageManager.PERMISSION_DENIED://拒绝授权-1
                                Utils.ShowToast(context,permissions[i]+"权限获取失败");
                                finish();
                                break;
                        }
                    }
                }
            }
        }
    }
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
    这个回调里面的grantResults,就是该权限返回的code码。我这里是一次获取多个权限,
    用的for循环,如果你只用申请一个,就不需要for循环,只用比较一次即可。
    demo就不用上传了,把这里的代码拷贝过去就可以直接用了。放到你的基类里面。
    需要的时候调用就可以了。

    
    
  • 1
  • 2
  • 3
  • 4
  • 5
                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
                        </div>
    android6.0及以上版本区分了:普通权限和危险权限。普通权限可以直接在清单文件里面申请,
    危险权限不仅要在清单文件里面申请,还要在代码里面动态获取。如果你仅仅动态获取了,
    没有在清单文件里面申明,在你返回的回调方法里面会被拒绝给权限。
    我这里的思路就是,先判断版本号是否大于android6.0,
    然后判断你的操作需要的权限哪些是没有给的,没有给的就去动态获取,给了的就不用
    接着,弹出对话框提示用户,需要这些权限的原因,让用户去选择,是否给该权限
    最后,系统也会弹出一个对话框,让用户去确认,是否给权限。
    注意:如果这里,我们自己的对话框,用户选择了是,然后没有弹系统的对话框让用户去选择,
    就直接被拒绝了,那就是前面我说过的,在清单文件里面没有注册该权限。
    这里,我以拍照为例。调用方式如下:

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
String[] permission = {Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE};//需要的权限
        String title = "相机权限不可用";
        String content = "由于上传照片需要获取相机相关权限,获取相册功能;\n否则,您将无法正常使用相机功能";
        initPermission(permission,title,content);
  
  
  • 1
  • 2
  • 3
  • 4
    1、首先:判断版本号是否大于android6.0for循环判断哪些需要获取的权限

  
  
  • 1
  • 2
    /**
     * 初始化用户权限
     * @param permissions 需要的权限
     * @param title 我们自己对话框的标题
     * @param content 我们自己对话框的内容
     */
    public void initPermission(String[] permissions, String title, String content) {
        // 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            List<String> permissionList = new ArrayList<>();
            for (int i = 0; i < permissions.length; i++) {//for循环把需要授权的权限都添加进来
                if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) {  //未授权就进行授权
                    permissionList.add(permissions[i]);
                }
            }
            //如果permissionList是空的,说明没有权限需要授权,什么都不做,该干嘛干嘛,否则就发起授权请求
            if (!permissionList.isEmpty()) {
                showDialogTipUserRequestPermission(permissionList, title, content);
            }
        }
    }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
    2、弹出对话框,让用户选择是否给权限

  
  
  • 1
  • 2
// 提示用户该请求权限的弹出框
    private void showDialogTipUserRequestPermission(final List<String> permissionList, String title, String content) {
        new android.support.v7.app.AlertDialog.Builder(this)
                .setTitle(title)
                .setMessage(content)
                .setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startRequestPermission(permissionList);
                    }
                })
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                }).setCancelable(false).show();
    }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
    3、提交权限的请求

  
  
  • 1
  • 2
// 开始提交请求权限
    private void startRequestPermission(List<String> permissionList) {
        if (!permissionList.isEmpty()) {//不为空就进行授权申请
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(this, permissions, permissionsRequestCode);
        }
    }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
    4、回调方法

  
  
  • 1
  • 2
// 用户权限 申请 的回调方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == permissionsRequestCode) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (grantResults.length > 0) {//安全写法,如果小于0,肯定会出错了
                    for (int i = 0; i < grantResults.length; i++) {
                        int grantResult = grantResults[i];
                        switch (grantResult){
                            case PackageManager.PERMISSION_GRANTED://同意授权0
                                break;
                            case PackageManager.PERMISSION_DENIED://拒绝授权-1
                                Utils.ShowToast(context,permissions[i]+"权限获取失败");
                                finish();
                                break;
                        }
                    }
                }
            }
        }
    }
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
    这个回调里面的grantResults,就是该权限返回的code码。我这里是一次获取多个权限,
    用的for循环,如果你只用申请一个,就不需要for循环,只用比较一次即可。
    demo就不用上传了,把这里的代码拷贝过去就可以直接用了。放到你的基类里面。
    需要的时候调用就可以了。

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
                        </div>

猜你喜欢

转载自blog.csdn.net/sinat_25136209/article/details/80111847