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

最近在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






发布了8 篇原创文章 · 获赞 11 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览