一天一Android之运行时权限
说起权限问题,iOS
平台处理的非常严谨,几乎所有的权限都需要在运行时由用户来确认是否允许应用使用此权限。android
平台稍微好一点,一部分权限只需要在AndroidManifest.xml
中申请一下就可以使用,一部分却需要在运行时由用户来确定。今天就来说说Android
的运行时权限问题。
简介
运行时权限是在Android6.0
才出现的。权限能很好的保护用户的隐私。谷歌将权限分为两类,一类是Normal Permissions
,这类权限一般不涉及用户的隐私,不需要用户进行授权,只需要在AndroidManifest.xml
中申请就可以。另一类是Dangerous Permission
,这类一般都是涉及到用户的隐私的,不仅需要在AndroidManifest.xml
中申请,还需要用户进行授权,比如读取SD卡等。
Normal Permissions 如下:
|
Dangerous Permissions 如下:
|
可以看到,危险权限都是一组一组的,那么分组的意义何在呢?
如果你申请某个危险的权限,假设APP早已经被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权,比如当APP对READ_CONTACTS
已经授权了,当你申请WRITE_CONTACTS
时,系统会直接授权通过。另外,对于申请时弹出的dialog
上面的文本说明也是对整个权限组的说明,而不是单个权限。不过需要注意的是,不要对权限组依赖过多,尽可能对每个危险权限都进行正常流程的申请,因为权限组可能会在后期的版本中有变化。
请求权限
请求权限的步骤分为如下几步:
1 . 在AndroidManifest.xml
文件中添加需要申请的权限。如果不添加,可能会崩溃。
2 . 检查权限
|
这里判断某权限是否被用户授权的方法是:checkSelfPermission
,方法接收一个参数,为权限名称。此方法为ContextWrapper
的实例方法,而我们的Activity
一般都间接继承于ContextWrapper
,所以,可以在Activity
中直接调用此方法。方法返回两种结果:PackageManager.PERMISSION_DENIED
和PackageManager.PERMISSION_GRANTED
,当返回DENIED
就需要申请授权了。
3 . 申请授权
|
此方法定义在Activity
中,接收;两个参数,第一个为需要申请的权限的字符串数组,第二个为请求码。主要用于回调的时候检测,系统允许我们一次性申请多个权限,系统会逐一询问用户。注意,此方法为异步。
4 . 处理权限申请回调
|
此回调方法回回传三个参数,第一个为请求码,就是我们在请求权限时候传多去的请求码,第二个是权限数组,第三个是请求结果数组。 这里,首先校验权限码,然后,判断grantResults
的长度是否大于0,因为这里我们申请的只有一种权限,所以我直接判断数组中的第一个元素是否为PackageManager.PERMISSION_GRANTED
,如果我们一次申请多个权限,需要分别判断。
基本的申请权限步骤已经介绍完毕。
完整的代码如下:
|
封装
虽然权限处理并不麻烦,但是需要编写很多重复的代码,所以,这里推荐一个库:MPermissions,用起来还是很方便的。
引入
首先,在项目的build.gradle
中添加如下代码:
|
然后在app
的buid.gradle
中添加如下代码:
|
使用
- 申请权限
|
- 处理权限回调
|
完整的代码:
|