Android10新功能和行为变更

91 阅读6分钟

新功能

在外部存储设备中创建文件的改进

除了引入分区存储,Android 10 还添加了以下与外部存储相关的功能:

  • 使用 IS_PENDING 标志向应用授予对写入磁盘的媒体文件的独占访问权限。
  • 提示系统在指定位置存储新文件。
  • 每个外部存储设备都有唯一的卷名称。

前台服务类型

Android 10 引入了 foregroundServiceType XML 清单属性,可以将其包含在多项特定服务的定义中。您可以为特定服务分配多个前台服务类型。

官方文档:前台服务类型

更多

更多功能请参考 官方文档:Android 10 功能和 API

行为变更

所有应用的行为变更

Android 10 引入了一些行为变更,这些变更可能会影响您的应用。当应用在 Android 10 上运行时,无论应用的 targetSdkVersion 为何,这些变更都会生效。您应该测试并视需要修改应用,以正确支持这些变更。

手势导航

从 Android 10 开始,用户可以启用手势导航。手势导航会影响所有应用,无论应用是否以 API 级别 29 为目标平台。例如,用户从屏幕边缘向内滑动,系统会将该手势解读为“返回”导航,除非应用明确替换该手势。

为了使您的应用与手势导航兼容,您需要将应用内容扩展到屏幕边缘,并处理冲突手势。有关信息,请参阅手势导航文档。

HTTPS 连接变更

在 Android 10 中,如果将 null 传递到 setSSLSocketFactory(),则会发生 IllegalArgumentException。在以前版本中,将 null 传入 setSSLSocketFactory() 与传入当前默认设置效果相同。

更多

更多行为变更请参考 官方文档:Android 10 所有应用行为变更

以 API 29+ 为目标平台的应用

Android 10 包含更新后的系统行为变更,这些变更可能会影响您的应用。本页列出的变更仅适用于以 API 29 或更高版本为目标平台的应用。将 targetSdkVersion 设置为 29 或更高的应用,必须修改以正确支持这些行为(如果适用)。

针对全屏 Intent 的权限变更

如果应用以 Android 10 或更高版本为目标平台并使用包含全屏 intent 的通知,则必须在应用的清单文件中请求 USE_FULL_SCREEN_INTENT 权限。这是普通权限,系统会自动为请求权限的应用授予此权限。

若未请求此权限便尝试创建包含全屏 intent 的通知,系统会忽略全屏 intent 并输出以下日志消息:

fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

支持可折叠设备

Android 10 增加了对可折叠设备和大屏设备的支持。

更多

更多行为变更请参考 官方文档:以 API 29+ 为目标平台的应用行为变更

非 SDK 限制

为了确保应用的稳定性和兼容性,Android 平台限制了应用在 Android 9(API 级别 28)中使用哪些非 SDK 接口。Android 10 更新了受限制的非 SDK 接口列表。我们的目标是在限制使用非 SDK 接口之前,确保有可用的公开替代方案。

官方文档:非 SDK 限制

隐私权

Android 10 引入了大量变更,以改进系统界面、使权限授予更严格以及限制应用使用的数据,从而保护隐私权并赋予用户更多控制权。

分区存储

默认情况下,以 Android 10 及更高版本为目标平台的应用在访问外部存储空间时被分区访问。此类应用可以在无需请求与存储相关的用户权限的情况下,查看外部存储设备中的以下类型文件:

  • 应用专属目录中的文件(使用 getExternalFilesDir() 访问)。
  • 应用创建的照片、视频和音频片段(通过 媒体库 访问)。

详细了解分区存储以及如何共享、访问和修改外部存储设备上的文件,请参阅 管理外部存储设备中的文件访问和修改媒体文件 的指南。

在后台运行时访问设备位置信息需要权限

为了更好地控制应用对位置信息的访问,Android 10 引入了 ACCESS_BACKGROUND_LOCATION 权限。

ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限不同,ACCESS_BACKGROUND_LOCATION 只会影响应用在后台运行时对位置信息的访问。除非满足以下条件之一,否则应用会被视为在后台访问位置信息:

  • 应用的 activity 可见。
  • 应用正在运行一项已声明前台服务类型 location 的前台服务。

以 Android 9 或更低版本为目标平台时自动授予访问权限

如果应用在 Android 10 或更高版本上运行,但以 Android 9(API 级别 28)或更低版本为目标平台,平台会自动授予访问权限:

  • 若应用声明了 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限,系统会在安装过程中自动为 ACCESS_BACKGROUND_LOCATION 添加权限。
  • 若应用请求了 ACCESS_FINE_LOCATION 或 `

ACCESS_COARSE_LOCATION,系统会自动将 ACCESS_BACKGROUND_LOCATION 添加到请求中。

在后台运行时访问设备位置信息需要权限

针对从后台启动 Activity 的限制

从 Android 10 开始,系统增加了针对从后台启动 Activity 的限制。这有助于减少对用户的干扰,并让用户更好地控制屏幕上显示的内容。只要应用因用户互动的直接结果启动 Activity,该应用就不会受到这些限制的影响。

适配方案请参考针对从后台启动 Activity 的限制

随机分配 MAC 地址

在搭载 Android 10 或更高版本的设备上,系统默认传输随机分配的 MAC 地址。

如果应用处理企业用例,平台提供 API 用于执行与 MAC 地址相关的多项操作:

  • 获取随机分配的 MAC 地址:设备所有者应用和资料所有者应用可以通过调用 getRandomizedMacAddress() 检索分配给特定网络的随机分配 MAC 地址。
  • 获取实际的出厂 MAC 地址:设备所有者应用可以通过调用 getWifiMacAddress() 检索设备的实际硬件 MAC 地址。此方法对于跟踪设备队列非常有用。

对不可重置的设备标识符的限制

从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包括 IMEI 和序列号)。

受影响的方法包括:

  • Build
    • getSerial()
  • TelephonyManager
    • getImei()
    • getDeviceId()
    • getMeid()
    • getSimSerialNumber()
    • getSubscriberId()

一些电话 API、蓝牙 API 和 WLAN API 需要精确位置权限

如果应用以 Android 10 或更高版本为目标平台,则必须具有 ACCESS_FINE_LOCATION 权限,才能使用 Wi-Fi API、Wi-Fi Aware API 或 Bluetooth API 中的多种方法。

受影响的 API 请参考一些电话 API、蓝牙 API 和 WLAN API 需要精确位置权限

更多

更多隐私权变更请参考 官方文档:Android 10 中的隐私权变更