行为变更:以 Android 13 或更高版本为目标平台的应用

与早期版本一样,Android 13 包含一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影响以 Android 13 或更高版本为目标平台的应用。如果您的应用以 Android 13 或更高版本为目标平台,您应该修改自己的应用以适当地支持这些行为(如果适用)。

此外,请务必查看对 Android 13 上运行的所有应用都有影响的行为变更列表。

隐私权

通知权限会影响前台服务的显示

如果用户拒绝授予通知权限,就不会在抽屉式通知栏中看到与前台服务相关的通知。 不过,无论是否授予通知权限,用户仍会在任务管理器中看到与前台服务相关的通知。

针对附近 Wi-Fi 设备的新运行时权限

在以前的 Android 版本中,用户需要向您的应用授予 ACCESS_FINE_LOCATION 权限,应用才能完成一些常见的 Wi-Fi 用例。

由于用户很难将位置信息权限与 Wi-Fi 功能相关联,因此 Android 13(API 级别 33)在 NEARBY_DEVICES 权限组中引入了运行时权限,适用于管理设备与附近 Wi-Fi 接入点连接情况的应用。此权限 (NEARBY_WIFI_DEVICES) 可满足以下 Wi-Fi 用例:

  • 查找或连接到附近的设备,如打印机或媒体投射设备。通过该工作流,您的应用可以完成以下类型的任务:
    • 通过带外方式(例如通过 BLE)接收 AP 信息。
    • 使用仅限本地使用的热点,通过 Wi-Fi 感知和连接功能发现并连接到设备。
    • 通过 Wi-Fi 直连发现和连接到设备。
  • 发起与已知 SSID(例如汽车或智能家居设备)的连接。
  • 开启仅限本地使用的热点。
  • 连接到附近的 Wi-Fi 感知设备。

只要您的应用不会通过 Wi-Fi API 推导物理位置,那么当您以 Android 13 或更高版本为目标平台并使用 Wi-Fi API 时,就可以请求 NEARBY_WIFI_DEVICES 而不是 ACCESS_FINE_LOCATION。当您声明 NEARBY_WIFI_DEVICES 权限时,请强烈断言您的应用绝不会通过 Wi-Fi API 推导物理位置信息。为此,请将 android:usesPermissionFlags 属性设置为 neverForLocation。此过程类似于您在 Android 12(API 级别 31)及更高版本中声明绝不会将蓝牙设备信息用于获取位置信息的过程。

详细了解如何请求获取访问附近 Wi-Fi 设备的权限

细化的媒体权限

该对话框的两个按钮,从上至下分别为“Allow”和“Don't allow”
图 1. 您在请求 READ_MEDIA_AUDIO 权限时向用户显示的系统权限对话框。

如果您的应用以 Android 13 或更高版本为目标平台,并且需要访问其他应用已经创建的媒体文件,您必须请求以下一项或多项细化的媒体权限,而不是READ_EXTERNAL_STORAGE 权限:

媒体类型 请求权限
图片和照片 READ_MEDIA_IMAGES
视频 READ_MEDIA_VIDEO
音频文件 READ_MEDIA_AUDIO

在访问其他应用的媒体文件之前,请确认用户已向您的应用授予适当的精细媒体权限。

图 1 显示了请求 READ_MEDIA_AUDIO 权限的应用。

如果您同时请求 READ_MEDIA_IMAGES 权限和 READ_MEDIA_VIDEO 权限,系统只会显示一个系统权限对话框。

如果您的应用之前已获得 READ_EXTERNAL_STORAGE 权限,则在升级时,系统会自动授予任何请求的 READ_MEDIA_* 权限。您可以使用以下 ADB 命令来查看升级后的权限:

adb shell cmd appops get --uid PACKAGE_NAME

在后台使用身体传感器需要新的权限

Android 13 中引入了“在使用时”访问身体传感器(例如心率、体温和血氧饱和度)的概念。此访问模式与 Android 10(API 级别 29)系统为位置信息引入的模式非常相似。

如果您的应用以 Android 13 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS 权限外,您还必须声明新的 BODY_SENSORS_BACKGROUND 权限。

性能和电池

电池资源利用率

如果用户因后台电池用量过高而将您的以 Android 13 为目标平台的应用置于“受限”状态,除非应用因其他原因启动,否则系统不会传送 BOOT_COMPLETED 广播或 LOCKED_BOOT_COMPLETED 广播。

用户体验

派生自 PlaybackState 的媒体控件

对于以 Android 13(API 级别 33)及更高版本为目标平台的应用,系统会从 PlaybackState 操作派生媒体控件。这样,系统便可以显示一组功能更丰富的控件,这些控件在技术上是可以在手机和平板电脑设备之间保持一致的,同时还与媒体控件在 Android Auto 和 Android TV 等其他 Android 平台上的呈现方式保持一致。

图 2 分别展示了其在手机和平板电脑设备上的显示效果。

媒体控件在手机和平板电脑设备上的显示方式,用一首示例歌曲演示按钮可能的显示效果
图 2 :手机和平板电脑设备上的媒体控件

在 Android 13 之前,系统会按照添加顺序显示 MediaStyle 通知中的最多五项操作。在紧凑模式下(例如,在收起的快捷设置中),系统会显示最多三项操作(通过 setShowActionsInCompactView() 指定)。

从 Android 13 开始,系统会根据 PlaybackState 显示最多五个操作按钮,如下表所述。在紧凑模式下,将只显示前三个操作槽位。对于未以 Android 13 为目标平台的应用或不包含 PlaybackState 的应用,系统将根据添加到 MediaStyle 通知中的 Action 列表显示控件,如前一段所述。

槽位 操作 条件
1 播放 PlaybackState 的当前状态是以下状态之一:
  • STATE_NONE
  • STATE_STOPPED
  • STATE_PAUSED
  • STATE_ERROR
加载旋转图标 PlaybackState 的当前状态是以下状态之一:
  • STATE_CONNECTING
  • STATE_BUFFERING
暂停 PlaybackState 的当前状态不是以上任何状态。
2 上一页 PlaybackState 操作包含 ACTION_SKIP_TO_PREVIOUS
自定义 PlaybackState 操作不包含 ACTION_SKIP_TO_PREVIOUS,并且 PlaybackState 自定义操作包含尚未执行的自定义操作。
PlaybackState extra 包含键 SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREVtrue 布尔值。
3 继续 PlaybackState 操作包括 ACTION_SKIP_TO_NEXT
自定义 PlaybackState 操作不包含 ACTION_SKIP_TO_NEXT,并且 PlaybackState 自定义操作包含尚未执行的自定义操作。
PlaybackState extra 包含键 SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXTtrue 布尔值。
4 自定义 PlaybackState 自定义操作包含尚未执行的自定义操作。
5 自定义 PlaybackState 自定义操作包含尚未执行的自定义操作。

自定义操作会按照添加到 PlaybackState 中的顺序执行。

应用颜色主题会自动应用于 WebView 内容

对于以 Android 13(API 级别 33)或更高版本为目标平台的应用,setForceDark() 方法已废弃,因此调用该方法会导致空操作。

相反,WebView 现在始终会根据应用的主题属性 isLightTheme 来设置媒体查询 prefers-color-scheme。换句话说,如果 isLightThemetrue 或未指定,则 prefers-color-schemelight;否则为 dark。此行为意味着,系统会自动应用 Web 内容的浅色或深色样式(如果相应内容支持应用主题)。

对于大多数应用,新行为应自动应用适当的应用样式,不过,您应测试应用以检查是否存在可能已手动控制深色模式设置的情况。

如果您仍需要自定义应用的颜色主题行为,请改用 setAlgorithmicDarkeningAllowed() 方法。为了向后兼容以前的 Android 版本,我们建议使用 AndroidX 中的等效 setAlgorithmicDarkeningAllowed() 方法。

如需详细了解根据应用的 targetSdkVersion 和主题设置,应用可能会出现哪些行为,请参阅该方法的文档。

畅连乐享

BluetoothAdapter#enable() 和 BluetoothAdapter#disable() 已废弃

对于以 Android 13(API 级别 33)或更高版本为目标平台的应用,BluetoothAdapter#enable()BluetoothAdapter#disable() 方法已废弃,将始终返回 false

以下类型的应用不受这些更改的影响:

  • 设备所有者应用
  • 个人资料所有者应用
  • 系统应用

Google Play 服务

广告 ID 需要权限

使用 Google Play 服务广告 ID 且以 Android 13(API 级别 33)及更高版本为目标平台的应用必须在其清单文件中声明常规 AD_ID权限,如下所示:

<manifest ...>
    <!-- Required only if your app targets Android 13 or higher. -->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

    <application ...>
        ...
    </application>
</manifest>

如果您的应用以 Android 13 或更高版本为目标平台且未声明此权限,系统会自动移除广告 ID 并将其替换为一串零。

如果您的应用使用的 SDK 在库的清单中声明了 AD_ID 权限,则默认情况下,该权限会与应用的清单文件合并。在这种情况下,您无需在应用的清单文件中声明该权限。

如需了解详情,请参阅 Play 管理中心帮助中的广告 ID

更新后的非 SDK 限制

Android 13 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。

如果您的应用并非以 Android 13 为目标平台,其中一些变更可能不会立即对您产生影响。然而,虽然您目前仍可以使用一些非 SDK 接口(具体取决于应用的目标 API 级别),但只要您使用任何非 SDK 方法或字段,终归存在导致应用出问题的显著风险。

如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试您的应用来进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,应请求新的公共 API

如需详细了解此 Android 版本中的变更,请参阅 Android 13 中有关限制非 SDK 接口的更新。 如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制