所有应用:无论 targetSdkVersion 是否小于 28,都需要修改应用以正确支持这些变更。
API 28+ 应用的行为变更:指 targetSdkVersion 为 28 或更高的应用。
一: 所有应用
1. 后台对传感器的访问受限
为了增强用户隐私,Android 9 限制后台应用访问用户隐私数据,如麦克风或摄像头、连续报告模式的传感器(加速度计和陀螺仪)、如果需要在运行 Android 9 的设备上检测传感器事件,请使用前台服务。
2. 限制访问通话记录
如果需要访问通话记录或者需要处理去电,必须向 CALL_LOG 权限组明确请求这些权限。 否则会发生 SecurityException。
3. 限制访问电话号码
要从手机状态中读取电话号码,请根据您的用例更新应用以请求必要的权限:
-
要通过 PHONE_STATE Intent 操作读取电话号码,同时需要 READ_CALL_LOG 权限和 READ_PHONE_STATE 权限。
-
要从 onCallStateChanged() 中读取电话号码,只需要 READ_CALL_LOG 权限。 不需要 READ_PHONE_STATE 权限。
4. 启动Activity
在9.0 中,不能直接非 Activity 环境中(比如Service,Application)启动 Activity,需要在 Intent 中添加标志 FLAG_ACTIVITY_NEW_TASK
Intent intent = new Intent(this, TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
5. 刘海屏适配
如果你的页面不需要全屏显示(显示的内容不在状态栏区域),那么不需要额外的适配工作。
如果你想利用起来刘海区域,就需要获取刘海位置等信息进行适配。
显示屏缺口支持
6. 对使用非 SDK 接口的限制
二:API 28+ 应用的行为变更
1. 前台服务
Android 9 开始,启动前台服务必须请求 FOREGROUND_SERVICE 权限。这是普通权限,只要在清单文件中声明即可。
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
2. 构建序列号弃用
在 Android 9 中,Build.SERIAL
始终设为 "UNKNOWN"
,以保护用户隐私。
如果需要访问设备的硬件序列号,应改为请求 READ_PHONE_STATE
权限,然后调用 getSerial()。
3. 默认启用网络传输层安全协议 (TLS)。
如果应用以 Android 9 或更高版本为目标平台,则 isCleartextTrafficPermitted() 方法默认返回 false。如果需要针对特定网域启用明文,则您必须在应用的网络安全配置中,针对这些网域明确将 cleartextTrafficPermitted 设置为 true。
解决方案:
(1)后台接口改用 https
请求
(2)targetSdkVersion
降到 27 或以下
(3)在清单文件 application
节点下添加 android:usesCleartextTraffic="true"
原来默认为 true,但在 Android 9.0 中默认值改为了 false,因此将配置手动设为 true 即可解决明文传输被限制的问题
(4)更改网络安全配置:
首先在 res
目录下新建 xml
文件夹,添加 network_security_config.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 全部域名使用 http -->
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
也可以指定部分支持的 http 域名:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 部分域名使用 http -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">secure.example.com</domain>
<domain includeSubdomains="true">cdn.example1.com</domain>
</domain-config>
</network-security-config>
AndroidManifest.xml
中的 application
节点添加该配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
...
</application>
</manifest>
4. Apache HTTP 客户端弃用
从 Android 9.0 开始,默认情况下该库已从 bootclasspath 中移除,要想继续使用 Apache HTTP,需要在应用的 AndroidManifest.xml 文件中添加:
<manifest ... >
<application>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
...
</application>
</manifest>
网友评论