行为变更:以 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 接口的限制