Android版本适配总结(基于 6.0 ~ 9.0)
前言
Android系统已经发展了10年之久,按照谷歌的命名风格,每个安卓版本都会以英文字母的顺序来进行命名,并且它们都有一个好吃的甜品代号,从最初的纸杯蛋糕(cupcake)到现在的奥利奥(pie)以及最新的beta版本的Android Q。但据说从Android Q开始Google将以数字的形式去命名接下来的版本,android甜品时代即将落幕。废话不多说,请看干货!
Android6.0适配
动态权限(危险权限需要动态去申请)
我目前是导入一个依赖implementation ‘com.hjq:xxpermissions:5.2’,使用起来也就一行代码
Android 7.0适配
-
外部分享文件(应用间共享文件限制) Uri.fromFile()适配,使用系统相机需要fileprovider
参考:https://www.jianshu.com/p/1e290902e0f5 -
取消了静态广播
ps:广播使用案例
• 监听网络状态 进入APP时没有网络页面请求不到数据肯定是白板,通过系统监听网络状态,过一会有网络之后,广播通知APP重新加载
• 跨进程通信 相册清除缓存之后,通过广播通知相册删除网络加载的缩略图
• 消息推送
Android 8.0适配
- 通知渠道
Android O版本对通知做了规范性的控制,所有的通知都需要提供通知渠道,强制用户在发送通知的时候,对通知进行系统性的管理,新增了channel渠道功能,所以创建通知时需要给通知添加通知渠道NotificationChannel(其实7.0部分设备就有这个问题) - 不依附于activity的悬浮窗不能显示
在广播中弹出对话框时,需要将layout_flag设置为windowmanager.layoutparams.TYPE_APPLICATION_OVERLAY.
了解:8.0中新增了一种悬浮窗的窗口类型,TYPE_APPLICATION_OVERLAY,如果应用使用SYSTEM_ALERT_WINDOW权限并且尝试使用以下窗口类型之一在其它应用和系统窗口上方显示提醒窗口,都会显示在TYPE_APPLICATION_OVERLAY窗口类型的下方。 - 安装APK
涉及到需要访问清单文件或者pakagemanager类的时候,需要加入权限 - 透明窗口不允许锁定屏幕旋转
之前应用中的侧滑返回方案需要将窗口设为透明,但是由于没有适配横屏,因此将其屏幕方法锁定为竖屏。窗口透明 + 固定屏幕方向 会抛出下面的异常:java.lang. IllegalStateException
解决方案有两种:
适配横屏,去掉固定屏幕方向的限制。
仅在滑动开始的时候设置窗口透明 - SharedPreferences闪退
// MODE_WORLD_READABLE:Android 8.0以后不能使用这个获取,会闪退
// 应修改成MODE_PRIVATE
SharedPreferences read = getSharedPreferences(RELEASE_POOL_DATA, MODE_WORLD_READABLE);
Android 9.0适配
- 网络请求错误
以前我在开发的时候遇到这样一个问题,就是网络请求在其他设备上都能成功获取数据,但在Android9.0设备上经常出现请求不成功的情况(java.net.UnknownServiceException: CLEARTEXT communication to www.mianfeibox.cn not permitted by network security policy)因为(Android P(9.0)) Android9.0以后限制了非加密的流量请求,导致出现 not permitted by network security policy,所以后来我在谷歌官方文档查了一些资料,其实解决也挺简单的。
就是在res目录下新建network-security-config.xml文件,将cleartextTrafficPermitted设置为"true"
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在清单文件的application节点下进行配置,将新建的network-security-config.xml文件引用到这个属性当中,这个问题就解决了。注意:是在http请求的时候才会出现这个问题。
<application
android:networkSecurityConfig="@xml/network_security_config">
<!--Android 9.0加的-->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
</application>
-
错误弹窗
Android9.0以后部分手机打开应用会出现一个错误提示弹窗(detected problems with API compatibility),出现这种情况的原因是:Android P 后谷歌限制了开发者调用非官方公开API 方法或接口,如果代码中直接用反射调用源码就会出现这个错误弹窗,可以通过反射在APP启动的时候干掉这个弹窗。 -
非全屏的activity不能设置orientation
当activity的style设置了WindowsTranslucent 为 true或者WindowsTranslucent为false但windowSwipeToDismiss为true,或者WindowsFloating为true,Android9.0认为不是Fullscreen,这样做主要是想阻止非全屏activity锁定屏幕旋转而抢占全屏activity的焦点,所以会报错 -
qq分享报错,提示找不到schemeRegistry类
Android9.0完全弃用了Apache http客户端,想要继续使用,需要在清单文件中添加android:required=”false”
另外祝各位同仁节日快乐!