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

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

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

隐私权

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

如果用户拒绝通知权限,他们仍会在前台服务 (FGS) 任务管理器中看到与这些前台服务相关的通知,但不会在抽屉式通知栏中看到这些通知。

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

在以前的 Android 版本中,用户需要向您的应用授予 ACCESS_FINE_LOCATION 权限,应用才能完成与热点相关的多个常见 Wi-Fi 用例、Wi-Fi 直连、Wi-Fi RTT 等。

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

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

详细了解附近 Wi-Fi 设备权限

细化的媒体权限

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

如果您的应用以 Android 13 为目标平台,您必须请求一个或多个新权限,而不是 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 权限。

您请求的权限集取决于应用需要访问的媒体类型:

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

如果用户之前向您的应用授予了 READ_EXTERNAL_STORAGE 权限,系统会自动向您的应用授予每个新权限。

否则,当应用请求上表中显示的任何权限时,系统会显示面向用户的对话框。在图 1 中,应用请求 READ_MEDIA_AUDIO 权限。如果您同时请求 READ_MEDIA_IMAGES 权限和 READ_MEDIA_VIDEO 权限,系统只会显示一个系统权限对话框。

以 Android 13 为目标平台的迁移步骤

以 Android 13 为目标平台后,请声明您的应用所需的媒体权限。为了保持与旧版 Android 的兼容性,请在将 maxSdkVersion 设置为 32 时声明 READ_EXTERNAL_STORAGE 权限,如以下代码段所示:

<manifest ...>
    <!-- Required only if your app targets Android 13. -->
    <!-- Declare one or more the following permissions only if your app needs
    to access data that's protected by them. -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

    <!-- Required to maintain app compatibility. -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

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

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

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

安全

intent 过滤器会屏蔽不匹配的 intent

当您的应用向以 Android 13 或更高版本为目标平台的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的 <intent-filter> 元素匹配时,系统才会传送该 intent。不匹配的 intent 会被屏蔽。

不强制要求匹配 intent 的例外情况包括:

  • 传送到未声明任何 intent 过滤器的组件中的 intent。
  • 源自同一应用内的 intent。
  • 源自系统的 intent;也就是说,从“系统 UID”(uid=1000) 发送的 intent。系统应用包括 system_server 和将 android:sharedUserId 设置为 android.uid.system 的应用。
  • 源自根的 intent。

如果接收方应用升级到 Android 13 或更高版本,仅当 intent 与其声明的 <intent-filter> 元素匹配时,源自外部应用的所有 intent 才会传送到导出组件,而不考虑发送应用的目标 SDK 版本。

性能和电池

电池资源利用率

如果用户因后台电池用量过高而将您的以 Android 13 为目标平台的应用置于“受限”状态,系统会应用多项与广播相关的限制。

如需详细了解针对受限后台电池用量的新限制,请参阅介绍 Android 13 中引入的“电池资源利用率”功能的页面。

用户体验

派生自 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 中的顺序执行。