前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android8.0、9.0、10.0、11.0的新特性兼容适配代码修改

Android8.0、9.0、10.0、11.0的新特性兼容适配代码修改

作者头像
aqi00
发布2022-03-09 14:00:27
9590
发布2022-03-09 14:00:27
举报
文章被收录于专栏:老欧说安卓老欧说安卓

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

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

Android8.0

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

代码语言:javascript
复制
    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开始被舍弃了。 设置悬浮窗类型的兼容代码示例如下:

代码语言:javascript
复制
    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 获取设备序列号的兼容代码示例如下:

代码语言:javascript
复制
    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,文件内容如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

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

代码语言:javascript
复制
    <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

Android10

1、Android10默认开启沙箱模式,即使已经动态申请了存储卡读写权限,在外部存储上读写文件仍然失败。 首先确保代码已经添加动态申请存储权限的逻辑,然后给AndroidManifest.xml中的application节点增加以下属性:

代码语言:javascript
复制
        android:requestLegacyExternalStorage="true"

还要补充新的权限配置MANAGE_EXTERNAL_STORAGE,配置样例如下:

代码语言:javascript
复制
    <!-- Android10新增权限MANAGE_EXTERNAL_STORAGE -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

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

2、普通应用无法开启或者关闭WiFi功能 一旦build.gradle的targetSdkVersion设置29或更高数值(表示目标SDK版本为Android11或以上版本),则调用WifiManager实例的setWifiEnabled方法始终返回false,也就是无法成功设置WiFi的启用状态。此时要在代码中添加版本号判断,如果当前系统版本大于等于29,就不再开关WiFi,代码例子如下:

代码语言:javascript
复制
        if (Build.VERSION.SDK_INT >= 29) { // Android10之后,普通应用不能开关WiFi
            ck_wlan.setEnabled(false);
        } else {
            ck_wlan.setOnCheckedChangeListener(this);
        }

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

3、Android10新增了健身运动权限ACTIVITY_RECOGNITION 使用计步器时需要声明健身运动权限,改动点说明如下: (1)修改AndroidManifest.xml,增加新的权限配置

代码语言:javascript
复制
    <!-- Android10之后,计步器需要健身运动权限 -->
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

完整的代码例子见以下github页面 https://github.com/aqi00/android2/blob/master/device/src/main/AndroidManifest.xml (2)打开计步器页面时需要动态申请健身运动权限android.permission.ACTIVITY_RECOGNITION,代码片段如下:

代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= 29) {
    // Android10.0之后使用计步器需要健身运动权限
    if (PermissionUtil.checkPermission(this, "android.permission.ACTIVITY_RECOGNITION", (int) v.getId() % 4096)) {
        startActivity(new Intent(this, StepActivity.class));
    }
}

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

Android11

1、打包APK时必须勾选V2 依次选择菜单Build→Generate Signed Bundle/APK,在导出APK安装包的时候,V2复选框也要勾选,该选项可避免Janus漏洞,而且从Android11开始必须勾选V2,否则打出来的APK也无法安装。

2、Android11新增了查询所有应用的权限QUERY_ALL_PACKAGES 通常调用PackageManger的getInstalledApplications方法可以获取已安装的应用列表,获取代码示例如下:

代码语言:javascript
复制
List<ApplicationInfo> allApps = getPackageManager().getInstalledApplications(0);

但从Android11开始,还要修改AndroidManifest.xml,增加新的权限配置,以上代码才能查到所有已安装的应用。

代码语言:javascript
复制
    <!-- 查询所有已安装的应用(Android11新增权限) -->
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

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

3、Android11默认WebView不能访问存储卡上的网页

build.gradle中采用Android11编译时(targetSdkVersion 30),WebView无法访问存储卡的网页文件,此时要调用WebSettings的setAllowFileAccess方法设置为true。在Android10及以下版本,该值默认为true,但从Android11开始该值默认为false。 设置代码示例如下:

代码语言:javascript
复制
// 设置是否允许访问文件,如WebView访问存储卡的文件。
// 不过assets与res文件不受此限制,仍然可以通过“file:///android_asset”和“file:///android_res”访问
// Android11开始该值默认为false,故Android11必须设置为true才能访问存储卡的网页
wv_content.getSettings().setAllowFileAccess(true);

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Android8.0
  • Android9.0
  • Android10
  • Android11
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档