简单聊一下Android 6.0的运行时权限
来源:互联网 发布:地基处理计算软件 编辑:程序博客网 时间:2024/06/09 16:35
最近在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
- 简单聊一下Android 6.0的运行时权限
- Android 6.0 运行时权限 fragment的简单封装 basefragment
- Android 6.0 运行时权限简单处理
- Android 6.0 运行时权限简单处理
- Android中的运行时权限处理,最简单的方法。
- 对Android运行时权限的简单封装
- Android 6.0运行时权限 baseactivity简单封装
- 聊一聊Android 6.0的运行时权限
- 聊一聊Android 6.0的运行时权限
- 聊一聊Android 6.0的运行时权限
- 聊一聊Android 6.0的运行时权限
- 聊一聊Android 6.0的运行时权限
- Android 6.0 的运行时权限
- 解析Android 6.0 的运行时权限
- 聊一聊Android 6.0的运行时权限
- 聊一聊 Android 6.0 的运行时权限
- 聊一聊Android 6.0的运行时权限
- 聊一聊Android 6.0的运行时权限
- AFNetworking 2.x 的SSL身份认证
- MySql乱码解决
- COM口 大于9 连接不上问题总结
- 关于Mac下的Android Studio无法显示类的相关文档和关联源代码的问题
- 从头认识多线程-2.3 synchronized持有对象锁与类锁的不同点
- 简单聊一下Android 6.0的运行时权限
- fedora 一命令安装 maven
- TCP/IP SOCKET HTTP及HTTPS之间的关系及各自特性之总结
- Android面试题——Android四大组件
- 获取文件上传进度
- iOS开发之--图形上下文以及绘图
- Centos6.5编译php报错:configure: error: mcrypt.h not found. Please reinstall libmcrypt.
- Android 风格与主题(style and theme)
- Linux绚丽屏保xscreensaver安装