Android基础知识(十六):Android运行时权限
从Android6.0(API级别为23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限,可以让用户对应用的功能进行更多的控制。
一、系统权限分类
系统权限分为两类:正常权限和危险权限:
- 正常权限:不涉及到用户敏感信息,应用只需要在AndroidManifest中声明,系统会自动授予相应的权限。
- 危险权限:能够访问用户的敏感信息,申请敏感权限的时候,不仅需要在AndroidManifest中声明,还需要在运行时申请,用户同意之后才能获取到该权限。
另外一种系统权限分类方法可以分为Install权限(安装时权限)和Runtime权限(运行时权限):
- Install权限:安装时权限,在安装app时,就赋予该app的权限,即安装后立即获取到的权限。normal和signature级别的权限都是安装时权限。系统自动决定权限的赋予。特别的,如果使用权限的app和声明权限的app的签名不一致,则系统拒绝赋予该signature权限。
- Runtime权限:运行时权限,能访问用户的敏感信息,在targetSdkVersion是22及以下,dangerous权限是安装时权限,否则dangerous权限是运行时权限。
二、权限组
Android将不同的权限进行分组管理,任何权限都会属于一个权限组,包括正常权限和危险权限。
一个权限组有一个权限申请成功,则默认该权限组所有权限申请成功,再次申请该组其他权限时,系统将立即授予该权限。
以下为危险权限的9个分组,共24个权限。
特别注意:权限分组在将来的Android版本中可能发生变化,因此应用应当明确的请求需要的每项权限,即使用户已向应用授予该权限组中的其他权限,应用代码不应该依赖特定权限属于或不属于相同组的这种假设。
三、申请运行时权限
- 检查权限
在应用需要使用危险权限的时候,每次都需要通过调用检查权限的方法ContextCompat.checkSelfPermission()。如下所示:
如果应用具有此权限,则返回PackageManagerPERMISSION_GRANTED,并且应用可以继续操作;否则返回PERMISSION_DENIED,且应用必须明确向用户要求权限。 - 解释申请权限的原因
为了帮助查找用户可能需要解释的情形,Android提供了一个实用程序方法,即shouldShowRequestPermissionRationale()。
如果应用之前请求过此权限但用户拒绝了请求,该方法将返回true。如果用户在过去拒绝了权限请求,并且在权限请求系统对话框中选择了Don´t ask again选项,此方法返回false;如果设备规范禁止应用具有该权限,该方法也会返回false。 - 请求权限
如果应用尚无所需的权限,则应用必须调用一个requestPermissions()方法,以请求适当的权限。应用将传递其所需的权限,以及制定用于识别该权限请求的整形请求代码。
此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到requestPermissions()。
- 处理权限请求响应
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的onRequestPermissionsResult()方法,向其传递用户响应。
Ps:同时申请多个权限时,用户可能仅仅同意某个权限,在方法onRequestPermissionsResult()中要循环判断每个是否申请成功,然后进行后续操作。
参考资料:Android在运行时请求权限(官方文档)
Android6.0运行时权限 总结 & 实践
Android运行时权限处理