为了保证系统的完整性和用户的隐私,android的每一个应用运行在一个沙盒中。如果一个app想要使用本身沙盒之外的其他资源和信息,这个应用就要显示的去请求权限。按照请求权限类型的不同,这个系统可以自动的获取权限或者系统会向用户请求权限。
下面展示为了app如何去声明和请求权限。
根据权限的敏感程度,系统可以通过声明的方式(写入manifest文件)自动获得权限或者向用户请求数据。例如你的应用需要权限打开手电筒,这个系统就可以自动获取权限了。但是你的需要读取用户的联系人列表,系统就会询问用户是否批准该权限的使用。根据用户系统版本的不同,在Android5.1或者更低的版本中,用户在安装的时候授予权限,在6.0之后,在运行时候授予权限。
根据权限的敏感程度,权限分为normal和dangerous。
系统权限可以分为几种保护级别,最重要的两种是normal和dangerous。(1)Normal:normal级别的权限主要是指,需要访问本应用(沙盒)之外的数据或者资源,但是同时对用户的隐私或者对其他app的操作危害较小。
在API23中normal级别主要包含一下内容:
(2)dangerous:该应用想要使用的数据包含了用户的隐私数据,或者影响本地存储内容或者操作了其他的应用。例如,读取联系人列表的权限。这需要在运行时,显示的提醒给用户。
Permission groups
所有的dangerous级别的权限都属于一个权限组。如果你的设备运行在Android6.0(API23)或者更高的版本中,当你请求一个权限的,系统有如下流程:
如果当你在manifest中请求了一个dangerous级别的权限时候,同时这个app没有这个权限,手机系统将通过弹出框的形式通知用户。这个弹窗框不会详细的描述组内的权限具体是什么。例如,你的应用需要Read_Contact权限,弹出框只会告诉你需要授权contact权限。如果用户授权,该应用就会拥有这个Read_Contact权限.
如果这个app已经有了这个权限了,这时候又想获取该组下的另一个权限,应用就会在没有任何提示的情况下获取该权限。例如:以上我们获取了READ_CONTACT权限,如果这时候又想使用 WRITE_CONTACT权限,系统会立刻获取该权限,不会弹出框询问用户。
注释:任何一个权限都属于一个权限分组,然而,一个权限分组只会响应drangrous级别的权限。对于normal级别的权限你可以在权限分组中忽略它们。
1.在manifest文件中声明权限
package="com.example.snazzyapp">
...
2.运行时请求权限(>=Android 6.0)
在所有的API版本中,需要使用的权限(normal 和 drangrous)都要在manifest版本中声明,但是会根据不同的target版本,处理和响应的方式不同。
有两种方式实现:
(2)使用framework层提供的方法。(使用要求编译版本大于等于Android6.0)
Check For Permissions
如果有这个权限返回:
RequestPermissions
有一个方法可以在用户点击拒绝授权的之后,再次使用该需要授权的功能的时候,使用它做出“为什么需要使用该权限”的解释。
返回true:用户在先前拒绝授权。
返回false:(1)如果用户在过去拒绝授权,并且选择了“Don't askagain”选项(2)这个设备“规则性(Android 安全机制)”的禁止该应用拥有该权限。
Handle the permissions request response