Android 6.0权限适配过程中遇到的问题 浅谈

一、Android6.0 权限变化

在Android M中权限系统被重新设计,发生了很大的变化。

1. 6.0以后Android权限分普通权限危险权限,如果应用的targetSdkVersion>=23,危险权限AndroidManifest注册了也没用,要用户动态获取的,即谷歌为了用户安全性考虑,对危险权限不再是安装时许可了,而是使用时让用户自己判断。

二、Android6.0普通权限normal permission 和 危险权限dangerous permission

Normal Permission:写在xml文件里,那么App安装时就会默认获得这些权限,即使是在Android6.0系统的手机上,用户也无法在安装后动态取消这些normal权限,这和以前的权限系统是一样的,不变。

Dangerous Permission:还是得写在xml文件里,但是App安装时具体如果执行授权分以下几种情况:

1、targetSDKVersion < 23 & API(手机系统) < 6.0 :安装时默认获得权限,且用户无法在安装App之后取消权限。

2、targetSDKVersion >= 23 & API(手机系统) < 6.0 :安装时默认获得权限,且用户无法在安装App之后取消权限。

3、targetSDKVersion < 23 & API(手机系统) >= 6.0 :安装时默认获得权限,但是用户可以在安装App完成后动态取消授权( 取消时手机会弹出提醒,告诉用户这个是为旧版手机打造的应用,让用户谨慎操作 )。

4、targetSDKVersion >= 23 & API(手机系统) >= 6.0 :安装时不会获得权限,可以在运行时向用户申请权限。用户授权以后仍然可以在设置界面中取消授权,用户主动在设置界面取消后,在app运行过程中可能会出现crash。

三、Android 6.0+ 权限的管理 

好处:为Android系统的安全增强保障,用户能够有更加透明化的知情权。

坏处:作为开发的程序猿,就开始苦逼了 ,尤其是国产定制出现的各种奇葩,例如 魅、米 系统的定制没有按照谷歌给的标准(框架)来定制,魅Android6.0(Flyme)系统给用户的感觉还是6.0以下的系统授权方式,米Android6.0(MIUI)更牛叉,他自己的权限管理高于谷歌给予的权限 在Android系统设置里面设置权限管理(这个权限都是危险权限) 基本上没有效果,只有在MIUI里面的安全管家的权限管理设置才能生效,这样类似的定制系统就大大的增加了,开发者的难度。


Android 6.0权限适配过程中遇到的问题 浅谈_第1张图片
Android 6.0  9组危险权限

四、Android6.0权限处理

在权限方面网上有很多大牛们开源的库 :

1.PermissionsDispatcher permissionsdispatcher提供了一个简单的基于注释的API,在Android的棉花糖处理运行时的权限。 这个图书馆将负担来写一大堆检查报表是否得到许可或不从你,为了让你的代码干净和安全。

2.RxPermissions这个库可以与新的Android权限模型的rxjava使用M。如果你的项目里面没有集成rxjava 库 最好不要使用,因为不能增加应用太多体积,当然了 如果你集成  还是不错的

3.easypermissions是包装库来简化基本系统权限的逻辑时,targetingandroid M或更高。这个也是谷歌官方开源的库

4.AndPermission这个库集成方便并且适配不少国产手机   Android 6.0 运行时权限管理最佳实践

5.这个就是系统自带的方法

if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {// 没有权限。if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {// 用户拒绝过这个权限了,应该提示用户,为什么需要这个权限。}else{// 申请授权。ActivityCompat.requestPermissions(thisActivity,newString[]{Manifest.permission.READ_CONTACTS}, MMM);

}}

@OverridepublicvoidonRequestPermissionsResult(intrequestCode, String permissions[],int[] grantResults) {

switch(requestCode) {

caseMMM: {

if(grantResults.length >0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限被用户同意,可以去放肆了。

}else{// 权限被用户拒绝了,洗洗睡吧。}return;

}}}

五、国产手机设置权限的页面(持续更新中。。。)

这个是我从网上收集并总结的一个工具类



Android 6.0权限适配过程中遇到的问题 浅谈_第2张图片
Android各大手机品牌手机跳转到权限管理界面

这个链接地址后期会发出来 (如果没有发出来可以发邮件到我邮箱提醒我 或者回复 邮箱:[email protected])(图片里面的代码链接)


六、总结

在处理Android6.0权限的过程中,遇到了各种各样的问题,也在其中收获了很多东西。在使用过程中不管是使用原生的方法还是第三方开源的库 在适配国产手机或者一些定制比较深的手机还是会出现各种各样的问题。Android6.0适配的道路还是任重道远.......  

在适配一些奇葩的手机系统时,在我们实在不能判断权限有无的时候我们可以通过try catch来捕获异常 从而减少因权限导致的崩溃

你可能感兴趣的:(Android 6.0权限适配过程中遇到的问题 浅谈)