Android 9.0 适配

所有应用:无论 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 权限。这是普通权限,只要在清单文件中声明即可。


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文件:



        
    

也可以指定部分支持的 http 域名:



    
    
        secure.example.com
        cdn.example1.com
    

AndroidManifest.xml 中的 application 节点添加该配置:



    
            ...
    

4. Apache HTTP 客户端弃用

从 Android 9.0 开始,默认情况下该库已从 bootclasspath 中移除,要想继续使用 Apache HTTP,需要在应用的 AndroidManifest.xml 文件中添加:


    
        
            ...
    

5. 多进程使用 WebView 无法共用同一数据目录

按进程分设基于网络的数据目录

参考:
Android 9.0 适配指南
Android 9 功能和 API

你可能感兴趣的:(Android 9.0 适配)