Android 6.0运行时权限问题
2017-11-14 21:24
302 查看
google在2015年就推出了Android 6.0系统,我们也知道,在Android 6.0系统中,最重要的就是提供了动态权限管理,也叫做运行时权限机制
对于Android 6.0的运行时权限机制,有以下几点:
1、6.0系统默认为targetSDKVersion小鱼23的应用授予了所申请的全部权限,因此,对于6.0以前的版本,我们可以设置targetSdkVersion=22,程序运行时也不会崩溃。但是如果用户自己手动的设置了取消权限,则会影响我们的APP的正常运行,甚至会影响到功能的使用,这种情况将严重影响用户体验,也是我们所不能接受的
2、google将权限分为两类:normal permissions和dangerous permissions,
2.1> normal permissions权限一般不会涉及用户隐私,也无须用户授权,主要在manifest里申明就OK,程序安装时候自动授权就好,而且用户也不能手动取消该类授权
2.2> dangerous permissions权限一般都会涉及到用户的隐私,因此需要用户手动授权的,比如读取SD卡、通讯录等等,dangerous permissions是以分组的形式给出的,一组中的一个权限被授权了,该组的其他权限也将会被自动授权。此外,申请时候弹出的权限说明也是对整个权限组的说明,而不仅仅是对单个权限的说明
3、实现支持运行时权限,只要在build.gradle中设置targetSdkVersion=23即可。
eg:调用打电话的权限,程序运行时,会先判断当前APP是否拥有permission.CALL_PHONE的权限,如果有,则直接调用打电话功能;如果没有,则弹出提示框进行权限申请。onRequestPermissionResult就是申请权限的回调,如果用户“允许”(getResults【0】== PackageManager.PERMISSION_GRANTED),则调用打电话功能。如果用户拒绝,弹出提示框提示用户该权限已被拒绝。如果用户选择“拒绝”,则下一次还会弹出权限申请提示框,只不过这一次会多出一个选项,叫“不再询问”,如果用户勾选了该选项,则下次不会弹出权限申请提示框,而是直接调用onrequestpermissionResult,回调结果为最后一次用户的选择。此时,若想要再次打开该权限,则需要在“设置
-- 应用--配置应用--应用权限--XX权限”中操作。
4、处理“不再询问” 选项
如果用户选择了“不再询问”现象,这时候需要给用户一个友好的提示,就需要使用shouldShowRequestPermissionRational方法,这个方法用来帮助开发者向用户解释权限的情况,如果用户选择了“不再询问”,则shouldShowRequestPermissionRational会返回false,这时候我们就需要弹出一个dialog来提醒用户该权限的重要性
5、PermissionDispatcher框架的使用
1》在项目的gradle中添加 classpath 'com.neenbedankt.gralde.plugins:android-apt:1.8'
2》在APP的gradle中添加 apply plugin 'android-apt'
dependencies{
compile 'com.github.hotchemi:permissionsdispatcher:2.1.3'
apt 'com.github.hotchemi:permissionsdispatcher-processor:2.1.3'
}
3》 在activity或者fragment上添加注解 @RuntimePermissions
在需要获取权限的方法上添加注解 @NeedsPermmission(Manifest.XX)
提示用户为何要开启此权限 在方法上添加注解 @OnShowRationale(Manifest.XX)
在用户拒绝时候的提示 @OnPermissionDenied(Manifest.XX)
在用户选择“不再询问” 的时候的注释 @OnNeverAskAgain(Manifest.XX)
然后重新编译一下程序,会自动生成一个辅助类XXActivityPermissionDispatcher,其他的事情交给这个类来做就OK了,其实也就是在activity或者fragment的OnRequestPermissionResult()方法中调用此类的OnRequestPermissionResult方法即可
对于Android 6.0的运行时权限机制,有以下几点:
1、6.0系统默认为targetSDKVersion小鱼23的应用授予了所申请的全部权限,因此,对于6.0以前的版本,我们可以设置targetSdkVersion=22,程序运行时也不会崩溃。但是如果用户自己手动的设置了取消权限,则会影响我们的APP的正常运行,甚至会影响到功能的使用,这种情况将严重影响用户体验,也是我们所不能接受的
2、google将权限分为两类:normal permissions和dangerous permissions,
2.1> normal permissions权限一般不会涉及用户隐私,也无须用户授权,主要在manifest里申明就OK,程序安装时候自动授权就好,而且用户也不能手动取消该类授权
2.2> dangerous permissions权限一般都会涉及到用户的隐私,因此需要用户手动授权的,比如读取SD卡、通讯录等等,dangerous permissions是以分组的形式给出的,一组中的一个权限被授权了,该组的其他权限也将会被自动授权。此外,申请时候弹出的权限说明也是对整个权限组的说明,而不仅仅是对单个权限的说明
3、实现支持运行时权限,只要在build.gradle中设置targetSdkVersion=23即可。
eg:调用打电话的权限,程序运行时,会先判断当前APP是否拥有permission.CALL_PHONE的权限,如果有,则直接调用打电话功能;如果没有,则弹出提示框进行权限申请。onRequestPermissionResult就是申请权限的回调,如果用户“允许”(getResults【0】== PackageManager.PERMISSION_GRANTED),则调用打电话功能。如果用户拒绝,弹出提示框提示用户该权限已被拒绝。如果用户选择“拒绝”,则下一次还会弹出权限申请提示框,只不过这一次会多出一个选项,叫“不再询问”,如果用户勾选了该选项,则下次不会弹出权限申请提示框,而是直接调用onrequestpermissionResult,回调结果为最后一次用户的选择。此时,若想要再次打开该权限,则需要在“设置
-- 应用--配置应用--应用权限--XX权限”中操作。
4、处理“不再询问” 选项
如果用户选择了“不再询问”现象,这时候需要给用户一个友好的提示,就需要使用shouldShowRequestPermissionRational方法,这个方法用来帮助开发者向用户解释权限的情况,如果用户选择了“不再询问”,则shouldShowRequestPermissionRational会返回false,这时候我们就需要弹出一个dialog来提醒用户该权限的重要性
5、PermissionDispatcher框架的使用
1》在项目的gradle中添加 classpath 'com.neenbedankt.gralde.plugins:android-apt:1.8'
2》在APP的gradle中添加 apply plugin 'android-apt'
dependencies{
compile 'com.github.hotchemi:permissionsdispatcher:2.1.3'
apt 'com.github.hotchemi:permissionsdispatcher-processor:2.1.3'
}
3》 在activity或者fragment上添加注解 @RuntimePermissions
在需要获取权限的方法上添加注解 @NeedsPermmission(Manifest.XX)
提示用户为何要开启此权限 在方法上添加注解 @OnShowRationale(Manifest.XX)
在用户拒绝时候的提示 @OnPermissionDenied(Manifest.XX)
在用户选择“不再询问” 的时候的注释 @OnNeverAskAgain(Manifest.XX)
然后重新编译一下程序,会自动生成一个辅助类XXActivityPermissionDispatcher,其他的事情交给这个类来做就OK了,其实也就是在activity或者fragment的OnRequestPermissionResult()方法中调用此类的OnRequestPermissionResult方法即可
相关文章推荐
- Android 6.0 运行权限问题!
- RxPermissions解决Android 6.0 获取运行权限问题
- Android 6.0 运行中手动去设置界面取消该app的某个权限,导致application被强制销毁造成app崩溃问题的解决
- Android 6.0 运行权限的问题
- Android 6.0 运行时权限处理问题
- Android 6.0 运行时在Fragment中申请权限无法回调 问题
- Android 6.0运行时权限问题汇总
- Android 6.0 运行时权限处理问题
- Android 6.0 运行时权限处理问题
- Android 6.0 运行时权限处理
- 聊一聊Android 6.0的运行时权限
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0 RuntimePermission---聊一聊Android 6.0的运行时权限
- Android 6.0 运行时权限处理完全解析
- Android 6.0 运行时权限处理完全解析
- Android 6.0权限问题
- 谈谈Android 6.0运行时权限理解
- Android 6.0 Marshmallow运行时权限处理
- Android 6.0 运行时权限处理完全解析