Android8.0与Android9.0的新特性兼容适配代码修改

《Android Studio开发实战 从零基础到App上线(第2版)》在书后面的附录中给出了Android8和Android9的主要特性说明,附录表格如下图所示:


不过附录表格只涵盖了常见的功能代码适配,而Android8和Android9的众多新特性还涉及到其它的代码适配,下面就补充列出Android8和Android9的额外兼容处理说明:

Android8.0

1、属性动画组合AnimatorSet增加了setCurrentPlayTime和reverse方法,从而允许倒过来播放属性动画组合。
setCurrentPlayTime和reverse方法的调用方式示例如下:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        animSet.setCurrentPlayTime(0); // 设置当前播放的时间点
        animSet.reverse(); // 从动画尾巴开始倒播至setCurrentPlayTime设置的时间点
    }

完整的代码例子见以下github页面
https://github.com/aqi00/android2/blob/master/animation/src/main/java/com/example/animation/ObjectGroupActivity.java

2、普通应用不允许修改系统设置
也就是Android8.0之后无法再调用系统设置的修改方法Settings.System.putInt,像原来在代码里调整屏幕亮度的办法就不再适用了。
完整的代码例子见以下github页面
https://github.com/aqi00/android2/blob/master/device/src/main/java/com/example/device/LightActivity.java

3、悬浮窗要使用类型TYPE_APPLICATION_OVERLAY,原来的类型TYPE_SYSTEM_ALERT从Android8.0开始被舍弃了。
设置悬浮窗类型的兼容代码示例如下:

    WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
    // 设置为TYPE_SYSTEM_ALERT类型,才能悬浮在其它页面之上
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        // 注意TYPE_SYSTEM_ALERT从Android8.0开始被舍弃了
        wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    } else {
        // 从Android8.0开始悬浮窗要使用TYPE_APPLICATION_OVERLAY
        wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    }

完整的代码例子见以下github页面
https://github.com/aqi00/android2/blob/master/media/src/main/java/com/example/media/widget/FloatWindow.java

Android9.0

1、获取设备序列号的方式由Build.SERIAL改为Build.getSerial(),同时还需要先获得权限READ_PHONE_STATE
获取设备序列号的兼容代码示例如下:

扫描二维码关注公众号,回复: 10588330 查看本文章
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        et_wifi_name.setText(Build.getSerial());
    } else {
        et_wifi_name.setText(Build.SERIAL);
    }

完整的代码例子见以下github页面
https://github.com/aqi00/android2/blob/master/mixture/src/main/java/com/example/mixture/WifiApActivity.java

2、默认禁止访问http地址,只允许访问https地址。如果仍要访问http地址,需要修改配置
Android9开始默认使用加密连接,也就是只能访问https打头的网络地址,不能访问http打头的网络地址(如果访问http地址就会报错“No Network Security Config specified”)。此时要在network模块的res目录下面创建xml目录,并在xml目录下新建文件network_security_config.xml,文件内容如下所示:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后打开network模块的AndroidManifest.xml,在该文件的application节点下增加android:networkSecurityConfig属性,也就是下面这样:

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:networkSecurityConfig="@xml/network_security_config"
        android:name=".MainApplication">

配置完毕重新运行network模块,就能访问http打头的地址了。
其它无法访问网络图片、无法打开网页、无法下载APK等问题,均可照此办理。或者直接把http换成https也行。

完整的代码例子见以下github页面
https://github.com/aqi00/android2/blob/master/network/src/main/res/xml/network_security_config.xml
https://github.com/aqi00/android2/blob/master/network/src/main/AndroidManifest.xml
 

发布了226 篇原创文章 · 获赞 669 · 访问量 97万+

猜你喜欢

转载自blog.csdn.net/aqi00/article/details/88759343