您的位置:首页 > 移动开发 > Android开发

简单聊一下Android 6.0的运行时权限

2016-04-27 23:43 417 查看
最近在6.0上做开发,在申请“WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE”权限时报错。不解。明明我已经在Manifest文件上配置好权限了,为什么还要求我去申请这个权限呢?于是去查了一下。发现在Android
 6.0 多了一个叫做运行时权限的东西。在6.0以前,android的用户权限都是一刀切的,只要在Manifest中配置好了,用户在安装的时候接受了权限的提示,那么,这个应用就会拥有这个权限。但是现在不行了。

从6.0开始,Android引入了新的权限机制,就是运行时权限。

什么是运行时权限呢?就是现在,我们调用某些权限时,当运行时权限机制生效时,这个权限不是安装时赋予的,而是应用运行时去请求的。像下图:



像这种就是运行时权限机制。这种机制是基于权限的敏感度去适配的。android从6.0开始,将权限分成2个大类:

1.普通权限(normal-permissions)

2.危险权限(Dangerous permissions)

普通的权限只要你在Manifest中配置了就可以用了,使用和之前一样。当前普通权限有以下这些:



以上这些权限基本上不涉及到用户隐私,是不需要用户去进行授权的。而另一类,,一般是涉及到用户隐私,需要用户授权的。他们分别是:



以上这些危险权限,当我们在6.0上使用时,就不单单需要在Manifest中添加,还需在运行时采用在6.0新增的API去检测并申请权限,弹出权限管理(就是第一张图)的那个框,通知用户这个应用需要用到这个权限,请用户判断是否允许。当然,这个允许只需要允许一次就可。

google新增的API相关接口主要有3个:

int checkSelfPermission(String permission) 
        用来检测应用是否已经具有权限

void requestPermissions(String[] permissions, int requestCode) 
          进行请求单个或多个权限

void onRequestPermissionsResult(int requestCode, String[] permissions, int[]
grantResults)       
用户对请求作出响应后的回调

这3个接口都是很简单的。用回Android 提供的例子说明

private void showContacts() {
if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
PERMISSIONS_REQUEST_READ_CONTACTS);
} else {
doShowContacts();
}
}

{@literal @}Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showContacts();
}
}

当我们需要使用这些权限的时候,我们只需要在需要用到这些权限之前,像上面代码一样,先checkSelfPermission()一下,看下自身应用是否具有该权限,假如没有,就通过requestPermissions()去获取权限,然后通过onRequestPermissionsResult()回调获取权限时操作。这些操场只是在第一次获取权限时进行。大家有兴趣可以直接看android M的源码:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/Activity.java

不过需要注意的是,这3个方法只能在Acitivity或者Fragment中调用。Service等是没法直接调用的。

最后,假如大家还想了解更多,可以直接查阅Android给出的解释:

http://developer.android.com/intl/zh-cn/guide/topics/security/permissions.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: