动态权限管理

在一年多以前,google发布了Android6.0:Marshmallow棉花糖,随之而来的是新版本SDK的许多变化,其中很重要的一点就是新增了就是动态权限管理。

动态权限管理的出现一方面可以使用户更加方便的控制自己的隐私以及发现垃圾应用,另一方面却需要开发者重新适配应用权限,这无疑是需要增加很多工作量的,毕竟从前几乎不用考虑的东西现在开始变得复杂起来了。

彼时由于国内5.0普及程度尚且不够,所以并没有适配6.0权限的想法。转眼16年已入秋,Android7.0牛轧糖正式版都已发布,国内手机也在今年陆陆续续升级到6.0系统,已经到了必须进行新的权限适配的时候了。

权限列别

与传统的方式一样,需要用到的权限仍然要在manifest文件中进行申请,而在权限真正被调用的地方,google将权限分为了两类:


Normal Permissions类权限

这类权限一般不涉及用户隐私(基本权限),当用户安装或更新应用时,系统将授予应用所请求的属于 PROTECTION_NORMAL 的所有权限,比如访问网络,蓝牙请求等。只需要在Manifest.xml中简单声明这些权限就好,安装时就授权。不需要每次使用时都检查权限,而且用户不能取消以上授权。


Dangerous Permissions类权限

这类权限是一些涉及用户隐私安全的一些权限,比如调用摄像头,联系人信息,拨打电话等。这类权限不仅需要在AndroidManifest.xml中进行声明,还需要在使用的时候要求用户进行授权。所谓进行权限适配也就是对于Dangerous Permissions判断是否被授权、对用户发起请求授权及授权成功和失败的操作。而如果没有获取相关权限仍然进行操作,则会导致程序崩溃。


使用方式

  • 常规操作,在Manifest.xml中对需要的权限进行。

  • 需要使用相关权限时进行权限检查

    //这里判断是否具备读取当前位置的权限
    if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED) {
    //不具备该权限,需要进行申请
    }else{
    //表示具备权限,可以进行相关操作
    }

ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

  • 申请授权
    ActivityCompat.requestPermissions(MainActivity.this,
    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
    PERMISSIONS_REQUEST);

第一个参数是Context;第二个参数是需要申请的权限的字符串数组(支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权);第三个参数为requestCode,主要用于回调的时候检测。

  • 对权限申请进行回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST) {
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    //用户授予了相关权限,进行相关操作
    } else {
    //用户未授予相关权限
    }
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。


###使用permissionsdispatcher
第三方库也已经有许多,尝试了一下permissionsdispatcher,使用方法如下:

1.添加依赖:在module的build.gradle文件中添加:

apply plugin: 'android-apt'//顶部
dependencies {
compile 'com.github.hotchemi:permissionsdispatcher:${latest.version}'
apt 'com.github.hotchemi:permissionsdispatcher-processor:${latest.version}'
}

在project的build.gradle文件中添加:

buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}

2.一共有4个注解可以用

  • @RuntimePermissions:注册一个Activity或者Fragment用来处理权限(必须)

  • @NeedsPermission:注释出一个方法可以在里面请求一个或多个权限(必须)

  • @OnShowRationale:注释出一个方法向用户解释为什么需要这个权限(非必须)

  • @OnPermissionDenied:注释出一个方法,当用户拒绝授予该权限时走这里(非必须)

  • @OnNeverAskAgain:注释出一个方法,当用户选择“不在询问时会走这里”(非必须)

3.

  对必须类注解进行申明生成相应方法后,会自动生成一个类,类名为==本Activity名+PermissionsDispatcher==,在Activity中需要请求权限才能进行操作的地方调用==该类.needLocationWithCheck(this);==即可.

4.PermissionsDispatcher plugin

  这是一个插件,配合permissionsdispatcher使用可以偷懒,简直有一种ButterKnife的feel

5.注意事项:

  生成代码后需要对项目进行rebuild才会自动生成相关类,so报错先别慌。

6.一些废话:

  示例代码不愿再贴上来了,因为我也是一个不写注释的人,不想再手动写一遍注释,何况官网已经很详细,一篇文章从中文写到下午真的肚子饿,就酱。




0%