概述
前段时间将项目gradle升级到了3.0,并在上篇文章里记录了遇到的问题,本篇文章将继续补充下gradle升级所导致的联动修改,主要是动态权限的适配处理。
gradle升级背景
提高编译效率,以及项目框架更新需要,升级会提高不少开发效率:
Android Gradle 3.0.0插件是一个大版本的升级,对多个module带来了显著的性能提升。
由于构建per-call dexing提高了构建速度,每个类编译成独立的DEX文件,并且仅仅被修改的类重新编译。
当改变依赖项时,Gradle通过不访问依赖项的API的module不重新编译的方式来提高构建速度。
但是升级导致的联动修改也是加入动态权限的第一个原因 动态权限背景
1. gradle升级所导致的联动修改(targetSdkVersion >= 23)
2. 多数手机商场(已知小米,魅族,华为)已为自己系统定制“自家动态权限机制”,处理策略各不相同,交互体验上也不太友好,因此加入原生动态权限,统一提示策略,提高用户体验
框架选用
目前主流的框架有PermissionsDispatcher、RxPermissions和easypermissions,仔细比较了下,使用注解原理的比较多,详细比较可以参考这篇文章,都大同小异,最后自己封装了一个,想参考的朋友可以加群交流(文章底部有交流群信息)。
具体适配记录
目前网上关于动态权限的介绍及处理已经有很多,并且有很大一部分都写得很详细,所以关于动态权限的分组及系统限制等基础问题不再做赘述,只对适配过程中遇到的问题进行记录,希望对大家有所帮助
适配记录1--定位权限:
手机品牌:华为
系统版本:EMUI 4.0.0(基于android6.0)
问题描述:项目的线上版本(未加入动态权限)在手机能正常定位,并且定位服务功能不开启(关闭状态)也能正确定位,注意:这里说的定位功能不是指用户动态授权权限,具体参看截图
指的是设置里面的一项功能,已知的有华为和魅族手机有这个是设置项并且默认是关闭的,小米手机没有定位服务设置项(类似设置应该是:在云服务里>查找手机,默认是开启的),含动态权限的版本,即便用户同意授权定位权限,但是定位服务这里不开启的话,仍然是定位失败的,获取的经纬度均是“4.9E-324”,并且不会有任何报错信息,试尽了各种办法,均不生效,最终在设置项里找到了这个功能,开启!成功!!
问题总结:动态权限版本(targetSdkVersion >= 23)不但需要授权定位权限,而且需要手动打开定位服务功能,才能正常定位;非动态权限版本(targetSdkVersion < 23)不需要开启定位服务功能也能正常定位,坑爹啊!!!!!!
适配记录2--动态权限api不生效:
手机品牌:魅族
系统版本:Flyme 5.2.4.1A(基于android6.0)
问题描述:国内多数手机厂商在6.0以前就已经加入动态权限处理,并且各个厂商的处理逻辑均不相同,后来原生系统推出动态权限之后,又陆续的转回原生的处理逻辑,但是魅族手机就很任性了!!!直接忽视原生系统的处理逻辑,具体现象是:动态权限版本(targetSdkVersion >=23)的版本在相应的权限申请的时候,原生的申请弹窗以及授权结果回调都不生效!!!只弹一个魅族自家的询问弹窗,用户授权了走正常逻辑,拒绝之后不会触发回调,并且再次申请直接被忽视,没有任何提示,目前还没有没有找到相关的资料怎么解决。简直是没人性!!!
问题总结:目前没有找到解决办法。。。
适配记录3--权限拒绝会重启应用:
手机品牌:小米
系统版本:MIUI 9.2 稳定版(基于android7.1.1)
问题描述:动态权限版本(targetSdkVersion >=23)安装完成后首次请求拨打电话权限,如果用户拒绝应用会重启,并且没有任何崩溃日志,以后再次申请点击拒绝后会走正常的回调逻辑,把网上的动态权限文章翻了个遍也没有找到解决办法,try catch也无用。。后来看了下竞品,得到启发,把拨打电话的业务逻辑改了,将直接拨打电话改为跳转到拨号页(不直接拨打电话),由用户手动拨打,这样就不再需要申请权限。。。。
问题总结:无法清除的障碍,只能绕开它。。
目前遇到的问题就是这些,后续如果有新的发现会再补充,感觉android系统各厂家的定制化真的是千奇百怪啊,简直不要太坑!希望局座早日统一android。。。
有技术困惑的小伙伴可以加群交流
群号:168786059
加群备注:技术交流