Android 6.0权限逻辑详解

来源:互联网 发布:淘宝店铺怎样使用seo 编辑:程序博客网 时间:2024/06/05 14:26

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下载地址

原创粉丝点击