与之前的版本一样,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 用例
- 查找或连接到附近的设备,例如打印机或媒体投射设备。此工作流程允许您的应用完成以下任务
- 接收带外 AP 信息,例如通过 BLE。
- 发现并通过 Wi-Fi Aware 连接到设备,并使用仅限本地热点连接。
- 发现并通过 Wi-Fi Direct 连接到设备。
- 启动到已知 SSID 的连接,例如汽车或智能家居设备。
- 启动仅限本地热点。
- 到附近的 Wi-Fi Aware 设备的范围。
只要您的应用不从 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 设备的权限。
细粒度媒体权限
如果您的应用面向 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 显示了这在手机和平板电脑设备上的外观示例。
在 Android 13 之前,系统最多会显示 MediaStyle
通知中的五个操作,其顺序与 添加 顺序相同。在紧凑模式下(例如,在折叠的快速设置中),最多会显示三个使用 setShowActionsInCompactView()
指定的操作。
从 Android 13 开始,系统最多会根据下表中描述的 PlaybackState
显示五个操作按钮。在紧凑模式下,只会显示前三个操作栏位。对于不面向 Android 13 或不包含 PlaybackState
的应用,系统将根据添加到 MediaStyle
通知中的 Action
列表显示控件,如上一段所述。
栏位 | 操作 | 条件 |
---|---|---|
1 | 播放 | PlaybackState 的当前 状态 是以下状态之一
|
加载微调器 | PlaybackState 的当前 状态 是以下状态之一
|
|
暂停 | PlaybackState 的当前 状态 不是上述状态。 |
|
2 | 上一首 | PlaybackState 操作 包括 ACTION_SKIP_TO_PREVIOUS 。 |
自定义 | PlaybackState 操作 不包括 ACTION_SKIP_TO_PREVIOUS ,并且 PlaybackState 自定义操作 包括尚未放置的自定义操作。 |
|
空 | PlaybackState 额外信息 包括键 SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV 的 true 布尔值。 |
|
3 | 下一首 | PlaybackState 操作 包括 ACTION_SKIP_TO_NEXT 。 |
自定义 | PlaybackState 操作 不包括 ACTION_SKIP_TO_NEXT ,并且 PlaybackState 自定义操作 包括尚未放置的自定义操作。 |
|
空 | PlaybackState 额外信息 包括键 SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT 的 true 布尔值。 |
|
4 | 自定义 | PlaybackState 自定义操作 包括尚未放置的自定义操作。 |
5 | 自定义 | PlaybackState 自定义操作 包括尚未放置的自定义操作。 |
自定义操作按其添加到 PlaybackState
中的顺序放置。
应用颜色主题自动应用于 WebView 内容
对于面向 Android 13(API 级别 33)或更高版本的应用,setForceDark()
方法已弃用,如果调用该方法,则会产生无操作结果。
相反,WebView 现在始终根据应用的主题属性 isLightTheme
设置媒体查询 prefers-color-scheme
。换句话说,如果 isLightTheme
为 true
或未指定,则 prefers-color-scheme
为 light
;否则,为 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 会自动删除并替换为一系列零。
如果您的应用使用在库清单中声明 AD_ID
权限的 SDK,则默认情况下,该权限会与您的应用清单文件合并。在这种情况下,您无需在应用的清单文件中声明此权限。
要了解更多信息,请参阅 Play Console 帮助中的 广告 ID。
更新的非 SDK 限制
Android 13 包括基于与 Android 开发人员的合作以及最新的内部测试而更新的受限非 SDK 接口列表。在限制非 SDK 接口之前,我们会尽可能确保提供公共替代方案。
如果您的应用不面向 Android 13,则其中一些更改可能不会立即影响您。但是,虽然您目前可以使用某些非 SDK 接口(具体取决于应用的目标 API 级别),但使用任何非 SDK 方法或字段始终存在使应用崩溃的高风险。
如果您不确定您的应用是否使用了非 SDK 接口,您可以测试您的应用以了解详情。如果您的应用依赖于非 SDK 接口,则应开始计划迁移到 SDK 替代方案。尽管如此,我们也理解某些应用有使用非 SDK 接口的合理用例。如果您无法找到应用中某个功能的非 SDK 接口替代方案,则应请求新的公共 API。
要详细了解此 Android 版本中的更改,请参阅Android 13 中非 SDK 接口限制的更新。要详细了解非 SDK 接口,请参阅非 SDK 接口限制。