1.前言
大家还记得Android 6.0权限适配的泪水吗?而现在谷歌已经出了Android P的稳定版,而且谷歌粑粑,为了大家能给辛苦熬夜加班,特地的和个大市场合作,要强制推出9.0的适配,而近期在下不才,为了报着多踩坑的心态,做了一下7.0~9.0的适配,脸颊也是老泪两行
2.安卓6.0的适配
2.1 怎么适配
● 在6.0所有权限都需要申请?
曰:当然不是。只有属于危险权限的才需要申请。危险权限看下表1-2
● 那危险权限也很多啊,也要一个个申请?
曰:当然不是。你看看下面的表,都分好组了(9组),对于同一组内的权限,只要有一个被同意,其他的都会被同意。
● 谁最帅
曰:当然是子信。
2.2 列举权限的分组
表1-2危险权限分组
分组 | 名字 | 分割线 |
---|---|---|
PHONE | android.permission.READ_PHONE_STATE | |
android.permission.CALL_PHONE | ||
android.permission.READ_CALL_LOG | ||
android.permission.ADD_VOICEMAIL | ||
android.permission.WRITE_CALL_LOG | ||
android.permission.USE_SIP | ||
android.permission.PROCESS_OUTGOING_CALLS | ||
CALENDAR | android.permission.READ_CALENDAR | |
android.permission.WRITE_CALENDAR | ||
CAMERA | android.permission.CAMERA | |
CONTACTS | android.permission.READ_CONTACTS | |
android.permission.WRITE_CONTACTS | ||
android.permission.GET_ACCOUNTS | ||
LOCATION | android.permission.ACCESS_FINE_LOCATION | |
android.permission.ACCESS_COARSE_LOCATION | ||
MICROPHONE | android.permission.RECORD_AUDIO | |
SENSORS | android.permission.BODY_SENSORS | |
SMS | android.permission.SEND_SMS | |
android.permission.RECEIVE_SMS | ||
android.permission.READ_SMS | ||
android.permission.RECEIVE_WAP_PUSH | ||
android.permission.RECEIVE_MMS | ||
STORAGE | android.permission.READ_EXTERNAL_STORAGE | |
android.permission.WRITE_EXTERNAL_STORAGE |
1 | <!-- 危险权限 start --> |
以上是列出9组需要动态申请的权限,建议自己代码统一封装成一个工具类,这里就不细说了, Android6.0权限工具
3.Android 7.0的适配
3.1 应用间共享文件
在targetSdkVersion大于等于的24的App中,但是我们没有去适配7.0。那么在调用安装页面,或修改用户头像操作时,就会失败。那么就需要你去适配7.0或是将targetSdkVersion改为24以下(不推荐)。适配的方法这里就不细讲,大家可以看鸿洋大神的 Android 7.0 行为变更 通过FileProvider在应用间共享文件这篇文章
3.2 APK signature scheme v2
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
1)只勾选v1签名就是传统方案签署,但是在7.0上不会使用V2安全的验证方式。
2)只勾选V2签名7.0以下会显示未安装,7.0上则会使用了V2安全的验证方式。
3)同时勾选V1和V2则所有版本都没问题。
3.3 org.apache不支持问题
1 | // build.gradle里面加上这句话 |
3.3 SharedPreferences闪退
1 | SharedPreferences read = getSharedPreferences(RELEASE_POOL_DATA, MODE_WORLD_READABLE); |
4.Android 8.0的适配
4.1 安卓8.0中PHONE权限组新增两个权限
1 | ANSWER_PHONE_CALLS:允许您的应用通过编程方式接听呼入电话。要在您的应用中处理呼入电话,您可以使用 acceptRingingCall() 函数。 |
4.2 通知适配
安卓8.0中,为了更好的管制通知的提醒,不想一些不重要的通知打扰用户,新增了通知渠道,用户可以根据渠道来屏蔽一些不想要的通知
兼容的代码
1 | /** |
4.3 安装APK
首先在AndroidManifest文件中添加安装未知来源应用的权限:
1 | <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> |
这样系统会自动询问用户完成授权。当然你也可以先使用 canRequestPackageInstalls()查询是否有此权限,如果没有的话使用Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES这个action将用户引导至安装未知应用权限界面去授权。
1 | private static final int REQUEST_CODE_UNKNOWN_APP = 100; |
4.4 SecurityException的闪退
问题原因:项目使用了ActiveAndroid,在 8.0 或 8.1 系统上使用 26 或以上的版本的 SDK 时,调用 ContentResolver 的 notifyChange 方法通知数据更新,或者调用 ContentResolver 的 registerContentObserver 方法监听数据变化时,会出现上述异常。
解决方案:
(1)在清单文件配置
1 | <provider |
(2)去掉这个监听刷新的方法,改为广播刷新
4.5 静态广播无法正常接收
问题原因: Android 8.0 引入了新的广播接收器限制,因此您应该移除所有为隐式广播 Intent 注册的广播接收器
解决方案: 使用动态广播代替静态广播
4.6 Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
1 | 问题原因: Android 8.0 非全屏透明页面不允许设置方向(后面8.1系统谷歌就去掉了这个限制,可能很多人真的不习惯吧) |
Android 9.0的适配
9.1 CLEARTEXT communication to life.115.com not permitted by network security policy
问题原因: Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉
解决方案:
在资源文件新建xml目录,新建文件
1 | <?xml version="1.0" encoding="utf-8"?> |
清单文件配置:
1 | <application |
但还是建议都使用https进行传输
9.2 其他Api的修改
java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed
1 | if (Build.VERSION.SDK_INT >= 26) { |
总结
经过几天的踩坑,终于把targetSdkVersion升级到28,对于以上的经验,也许还存在某些疏漏的,也希望大家可以指正,补充,告诉,希望对你有一定的帮助,鄙人也很开心。