Android 6.0新特性之 权限管理
2016-01-14 11:45
597 查看
Android 6.0中增加了 运行时permissions,就是说可以在运行时判断有无权限和获取权限,让用户同意即可。
在之前的版本都是安装的时候就会要用户同意各种权限,现在是在用的时候,回去问用户同意。
下面介绍一下我们应用在适配6.0的时候,需要做哪些事情吧,
权限添加
这个和之前的做法没有区别:在AndroidManifest中添加
检查权限
如果你需要一个危险的权限,就必须每次都检查你是否已经有权限了,所以如果有权限了,我们直接使用就可以了,如果没有那么就申请就好了
这是我们就要自己去申请
申请权限
但是呢,我们可以在弹框之前,单独弹一个窗口,来告诉为什么要申请权限,然后再去弹这个系统框,这样用户就会更加了解你为什么需要这个权限了。
所以我们的完整代码如下:
上面的大多数方法,我们都已经讲过了,根据注释,也理解了每一段都干了什么,
唯一需要额外说一下的是
如果我们的应用在之前请求过权限,但是用户拒绝了我们的请求,返回true
如果用户在之前关闭了权限,并且在请求对弹框时,选择了 Don't ask again 选项,返回false
如果设备方针拒绝这个应用拥有这个权限,返回false
上面是google说的几点,下面我再解释成人话,就是说:
我们第一次调用这里,肯定是返回false的,就会弹出来系统弹框,问你同不同意啊,
如果你同意了,以后就没这里什么事了
如果要是不同意呢,以后就会返回true,
那咱们就得弹个框,告诉用户问什么要权限,最好再有个同意按钮
在之前的版本都是安装的时候就会要用户同意各种权限,现在是在用的时候,回去问用户同意。
下面介绍一下我们应用在适配6.0的时候,需要做哪些事情吧,
权限添加
这个和之前的做法没有区别:在AndroidManifest中添加
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.snazzyapp"> <uses-permission android:name="android.permission.SEND_SMS"/> <application ...> ... </application> </manifest>在你声明权限之后,系统的行为取决于你权限的敏感程度,如果这个权限没有影响到用户隐私,系统会自动同意你的权限,如果权限可能影响用户隐私,那系统就会去征询用户的同意了,
检查权限
如果你需要一个危险的权限,就必须每次都检查你是否已经有权限了,所以如果有权限了,我们直接使用就可以了,如果没有那么就申请就好了
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);返回值就是是否已经有权限了,如果返回值是PackageManager.PERMISSION_GRANTED,就证明有权限了,如果返回PackageManager.PERMISSION_DENIED,那就证明还没有权限呢,
这是我们就要自己去申请
申请权限
ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);调用这个方法之后,会弹出一个标准的dialog,这个是不能被我们自定义的啊,长啥死样就看各个厂商了。
但是呢,我们可以在弹框之前,单独弹一个窗口,来告诉为什么要申请权限,然后再去弹这个系统框,这样用户就会更加了解你为什么需要这个权限了。
所以我们的完整代码如下:
// Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Manifest.permission.READ_CONTACTS)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } }
上面的大多数方法,我们都已经讲过了,根据注释,也理解了每一段都干了什么,
唯一需要额外说一下的是
ActivityCompat.shouldShowRequestPermissionRationale()
如果我们的应用在之前请求过权限,但是用户拒绝了我们的请求,返回true
如果用户在之前关闭了权限,并且在请求对弹框时,选择了 Don't ask again 选项,返回false
如果设备方针拒绝这个应用拥有这个权限,返回false
上面是google说的几点,下面我再解释成人话,就是说:
我们第一次调用这里,肯定是返回false的,就会弹出来系统弹框,问你同不同意啊,
如果你同意了,以后就没这里什么事了
如果要是不同意呢,以后就会返回true,
那咱们就得弹个框,告诉用户问什么要权限,最好再有个同意按钮
相关文章推荐
- OpenERP v6.1新特性解读 (一)整体易用性、界面、移动性
- OpenERP v6.1新特性解读 (三) 技术
- PostgreSQL教程(十二):角色和权限管理介绍
- C#6.0中10大新特性的应用和总结
- Serv-U 550 Permission denied 的解决办法
- FTP 550 Permission denied 只能建文件夹,没法删除及上传文件的原因说明
- JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
- Vue.js 2.5新特性介绍(推荐)
- Mysql权限管理grant命令使笔记
- PHP使用Session遇到的一个Permission denied Notice解决办法
- SQL Server2012在开发中的一些新特性
- Apache启动错误Permission denied: httpd: could not open error log file解决方法
- Android中Permission权限机制的具体使用
- Android中的Permission权限机制介绍
- PHP6 中可能会出现的新特性预览
- ThinkPHP3.1新特性之命名范围的使用
- 浅谈php7的重大新特性
- Java8新特性之字符串去重介绍
- Java 8 新特性终极版指南详解