Android 6.0权限逻辑详解

Android6.0权限需要主动申请已经很久了,这里写一篇文章记录下。
这类的文章也很多,各位可以百度参考下,下面我只是把权限申请的逻辑详细介绍下,并附上DEMO代码。

这里写图片描述

具体逻辑可以看上面的图片,逻辑已经很详细了。

请求单个权限

 public void startCamera(View view) {
        requestPermission(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS);
    }

    private void requestPermission(String... permissions) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true
            // 向用户解释为什么需要这个权限
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
                new AlertDialog.Builder(this)
                        .setMessage("申请相机权限")
                        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //申请相机权限
                                ActivityCompat.requestPermissions(SinglePermissionActivity.this,
                                        new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
                            }
                        })
                        .show();
            } else {
                //申请相机权限
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
            }
        } else {
            tvPermissionStatus.setTextColor(Color.GREEN);
            tvPermissionStatus.setText("相机权限已申请");
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CAMERA_REQUEST_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                tvPermissionStatus.setTextColor(Color.GREEN);
                tvPermissionStatus.setText("相机权限已申请");
            } else {
                //用户勾选了不再询问
                //提示用户手动打开权限
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
                    tvPermissionStatus.setText("相机权限已被禁止,需手动打开");
                    tvPermissionStatus.setTextColor(Color.RED);
                } else {
                    tvPermissionStatus.setText("相机权限已被禁止,可再次申请");
                    tvPermissionStatus.setTextColor(Color.RED);
                }
            }
        }
    }

请求多个权限

   public void startCamera(View view) {
        requestPermission(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS);
    }

    private void requestPermission(String... permissions) {
        List<String> deniedPermissions = findDeniedPermissions(this, permissions);
        if (deniedPermissions.size() > 0) {
            ActivityCompat.requestPermissions(this,
                    deniedPermissions.toArray(new String[deniedPermissions.size()]), CAMERA_REQUEST_CODE);
        } else {
            tvPermissionStatus.setText("相机、联系人权限已申请");
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CAMERA_REQUEST_CODE) {
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < permissions.length; i++) {
                if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    builder.append(permissions[i] + "权限已申请" + "\n");
                } else {
                    //用户勾选了不再询问,提示用户手动打开权限
                    if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
                        builder.append(permissions[i] + "权限已被禁止,需手动打开" + "\n");
                    } else {
                        builder.append(permissions[i] + "权限已被禁止,可再次申请" + "\n");
                    }
                }
            }
            tvPermissionStatus.setText(builder.toString());
        }
    }

    @TargetApi(value = Build.VERSION_CODES.M)
    public List<String> findDeniedPermissions(Context context, String... permission) {
        List<String> denyPermissions = new ArrayList<>();
        for (String value : permission) {
            if (ContextCompat.checkSelfPermission(context, value) != PackageManager.PERMISSION_GRANTED) {
                denyPermissions.add(value);
            }
        }
        return denyPermissions;
    }

参考:Android 6.0运行时权限详解

DEMO下载地址

猜你喜欢

转载自blog.csdn.net/u010259369/article/details/73505793