浅谈Android6.0运行时权限

引言

从 Android 6.0(API 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。这种权限机制可以让用户更好的管理应用的权限,保障用户隐私。

系统权限分类

  • 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
  • 危险权限会授予应用访问用户机密数据的权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。危险权限共分为9组24个,也就是说只要用户允许了每一组中的一条权限。就代表他允许了这个组中的全部权限。
    这里写图片描述

注意事项

  1. 在 Android 5.1(API 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在安装时要求用户授予权限。(沿用之前的权限系统)
  2. 即使在安装时已经授予应用所有权限,在Android 6.0之后依然可以通过 “Setting” 来关闭已经授予的权限。
  3. 在请求权限时,系统只告诉用户应用需要的权限组,而不告知具体权限。
  4. 如果在未检查授权的情况下,直接使用危险权限,会导致程序Crash。
  5. 使用 v4 包中的 ContextCompat 处理权限(v13 包中的FragmentCompat),不需要考虑版本问题。

实现方式

话不多说直接看代码

// 声明一个数组,用来存储所有需要动态申请的权限。这里写的是同时申请多条权限,如果你只申请一条那么你就在数组里写一条权限好了
    String[] permissions = new String[]{
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.CAMERA};
    // 同时我们可以声明一个集合,用来存储用户拒绝授权的权限。
    List<String> mPermissionList = new ArrayList<>();
private void checkPermission() {
        mPermissionList.clear();
        /**
         *PackageManager.PERMISSION_GRANTED 表示有权限, PackageManager.PERMISSION_DENIED 表示无权限。
         * 判断哪些权限未授予
         * 以便必要的时候重新申请
         */
        for (String permission : permissions) {
        //判断所要申请的权限是否已经授权
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(permission);
            }
        }
        /**
         * 判断存储委授予权限的集合是否为空
         */
        if (!mPermissionList.isEmpty()) {
            String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
            ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);//请求指定授权
        } else {//未授予的权限为空,表示都授予了
        }
    }
//重写onRequestPermissionResult方法来处理授权结果
 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                for (int i = 0; i < grantResults.length; i++) {
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                        //判断是否勾选禁止后不再询问
                        //如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
                        boolean showRequestPermission = ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permissions[i]);
                        if (showRequestPermission) {
                       //这里可以做相关操作,我这里是写的是重新申请权限
                            checkPermission();//重新申请权限
                            return;
                        } else {
                            //做相关操作。。。
                        }
                    }
                }
                break;
            default:
                break;
        }
    }

总结

其实仔细想想,动态权限申请其实也就那么几句话。多熟悉一下,应该可以很快掌握。对了最后还有一点,你要申请的动态权限不要忘了在清单文件中也要,静态的申明一下。不然还是会报错的。。。。。。

猜你喜欢

转载自blog.csdn.net/W_DevilMayCry/article/details/81204440