咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

Android13功能和 API 概览

【原文:功能和 API 概览】

Android 13 面向开发者引入了一些出色的新功能和 API。以下几部分内容可帮助您了解适用于您的应用的功能并开始使用相关 API。

有关新增、修改和移除的 API 的详细列表,请参阅 API 差异报告

开发者工作效率

新的复制和粘贴界面

从 Android 13 开始,将内容添加到剪贴板时,系统会显示标准视觉确认界面。新确认界面会执行以下操作:

  • 确认内容已成功复制。
  • 提供所复制内容的预览。

此功能可将应用在用户复制内容后显示的各种通知标准化,并让用户可以更好地控制剪贴板。如需了解详情,请访问复制和粘贴功能页面。

预测性返回手势

Android 13 针对手机、大屏设备和可折叠设备等 Android 设备引入了预测性返回手势。如需支持此功能,您需要更新应用。

如需查看详细文档,请参阅更新应用以支持预测性返回手势。您还可以尝试完成我们的 Codelab

带主题的应用图标

从 Android 13 起,用户可以选择启用带主题的应用图标。借助此功能,用户可以调节受支持的 Android 启动器中应用图标的色调,以继承所选壁纸和其他主题的配色。

如需支持此功能,您的应用必须提供自适应图标和单色应用图标,并通过清单中的 `` 元素指向该单色应用图标。如果用户启用了带主题的应用图标(换句话说,在系统设置中开启了带主题的图标切换开关),而启动器支持此功能,则系统将使用用户选择的壁纸和主题来确定色调颜色,然后该颜色将应用于单色应用图标。

在以下任何情况下,主屏幕都不会显示带主题的应用图标,而是显示自适应或标准应用图标:

  • 如果用户未启用带主题的应用图标
  • 如果您的应用不提供单色应用图标
  • 如果启动器不支持带主题的应用图标

规格

您的单色应用图标应符合以下规范:

  • 应是一个 VectorDrawable
  • 我们建议该徽标适合 108 x 108 dp 容器中的 44 x 44 dp 的区域内。如果需要更大尺寸的徽标,最大可以为 72 x 72 dp。
  • 我们建议您使用平面徽标;如果您的徽标是三维的,那么您可以使用 Alpha 渐变。

您必须将单色属性指向自适应应用图标的前台图层所使用的同一 VectorDrawable,或者重复使用用于通知的矢量可绘制对象。

以下示例展示了 Google 应用的单色应用图标,其中虚线表示徽标和容器区域之间的边界。此处显示的边界仅用于图示说明,其大小不可调整。

1 容器区域 (108 x 108 dp)。

2 徽标区域(建议尺寸为 44 x 44 dp,最大尺寸为 72 x 72 dp)。

实现带主题的应用图标

monochrome android:drawable 属性添加到 `` 元素中。例如,在 res/mipmap-anydpi-v26/ic_launcher.xml 中:

1
2
3
4
5
<adaptive-icon >
<background android:drawable="..." />
<foreground android:drawable="..." />
<monochrome android:drawable="@drawable/myicon" />
</adaptive-icon>

在您的清单文件中,使用 android:icon 定义图标:

1
2
3
4
5
<application

android:icon="@mipmap/ic_launcher"
…>
</application>

注意:如果清单中同时包含 android:roundIconandroid:icon,您必须移除对 android:roundIcon 的引用,或者在由 android:roundIcon 属性定义的可绘制对象中提供单色图标。

Quick Settings Placement API

通过通知栏中的“快捷设置”,用户可无需离开应用上下文就能方便地更改设置或执行快速操作。对于提供自定义图块的应用,用户可以更轻松地发现图块并将其添加到“快捷设置”。借助新的[图块放置 API](https://developer.android.google.cn/reference/android/app/StatusBarManager#requestAddTileService(android.content.ComponentName, java.lang.CharSequence, android.graphics.drawable.Icon, java.util.concurrent.Executor, java.util.function.Consumer)),您的应用现在可以提示用户直接将自定义图块添加到一组有效的快捷设置图块中。借助新的系统对话框,用户只需一步即可不离开应用就添加图块,而不必转到“快捷设置”来添加图块。

为多语言用户提供更好的支持

Android 13 引入了几项功能来改进多语言用户的应用体验,具体介绍请参阅以下几部分:

按应用设定的语言偏好设置

在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下功能:

  • 系统设置,可让用户在一个位置为各个应用选择首选语言。

    您的应用必须在应用的清单中声明 android:localeConfig 属性,以告知系统它支持多种语言。如需了解详情,请参阅有关创建资源文件并在应用的清单文件中声明资源的说明。

  • 使应用可在运行时设置在界面中使用的其他语言的 API

    使用自定义应用内语言选择器的应用应当使用这些新 API,以确保无论用户通过何种方式选择其语言偏好设置,都能获得一致的用户体验。新的 API 还有助于减少样板代码量、支持拆分 APK,并且支持应用自动备份,以存储应用级的用户语言设置。

    为了向后兼容以前的 Android 版本,AndroidX 中也提供了相应 API。我们建议使用 Appcompat 1.6.0-alpha03 或更高版本。

    如需了解详情,请参阅有关实现新 API 的说明。

改进了非拉丁字母的行高

Android 13 通过使用适合每种语言的行高,改进了非拉丁文字(例如泰米尔语、缅甸语、泰卢固语和藏语)的显示。新的行高可防止字符被裁剪并改进了字符的放置。您的应用只需要以 Android 13 为目标平台就可以利用这些改进。请确保在采用新的行间距后对应用进行测试,因为这些更改可能会影响非拉丁语的界面。

在 Android 12 中会被裁剪的行高,现在在 Android 13 中可以更好地放置并且不会被裁剪(如下方图片所示)。

文本转换 API

使用日语和中文等语言的用户会使用拼音输入法,这通常会导致搜索以及自动填充等功能的执行速度变慢。在 Android 13 中,应用可以调用新的文本转换 API,以便用户更快、更轻松地找到所需内容。例如,以前日语用户在进行搜索时需要执行以下步骤:

  1. 输入平假名作为其搜索字词(例如地点或应用名称)的发音
  2. 使用键盘将平假名字符转换为日语汉字
  3. 使用日语汉字字符重新进行搜索
  4. 最后获得搜索结果

使用新的文本转换 API 时,日语用户可以输入平假名,然后不经过第 2 步和第 3 步就立即看到实时的日语汉字搜索结果。

Unicode 库更新

Android 13 添加了一些最新改进、修复和变更,均包含在 Unicode ICU 70Unicode CLDR 40Unicode 14.0 中。

以下是两项显著变更:

  • 英语(加拿大)en‑CA 和英语(菲律宾)en‑PH 在无可用的翻译资源时均使用英语(美国)en 翻译资源,而非英语(英国)en‑GB 翻译资源。
  • 针对西班牙语 es、意大利语 it、葡萄牙语 pt 和葡萄牙语(葡萄牙)pt‑PT 引入了 many 复数类别。与 CLDR v38 中引入的法语类似,此类别适用于大数目。

更快断字

断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。在 Android 13 中,我们将断字性能优化了多达 200%,因此您现在可以在 TextView 中启用断字功能,这几乎不影响渲染性能。如需启用更快断字功能,请在 setHyphenationFrequency() 中使用新的 fullFastnormalFast 频率。

彩色矢量字体

Android 13 可支持呈现 COLR 版本 1 (COLRv1) 字体,并将系统表情符号更新成了 COLRv1 格式。COLRv1 是一种高度紧凑的新字体格式,该字体在任意大小下都可以快速清晰地呈现。

对于大多数应用,系统会处理所有工作,COLRv1 可以正常使用。不过,如果您的应用使用系统字体来实现自己的文本呈现,建议您对表情符号呈现进行测试。

如需详细了解 COLRv1,请参阅以下资源:

蓝牙 LE 音频

低功耗 (LE) 音频是新一代无线音频,旨在取代传统蓝牙并支持新的使用情形和连接拓扑。通过该技术,用户能够与朋友和家人分享音频内容以及播放音频给他们听,也可以订阅信息、娱乐或无障碍用途的公共广播内容。这项新技术可以确保用户接收到高保真度的音频,而不必牺牲电池续航时间,并且还可以在不同使用情形之间无缝切换,这是传统蓝牙技术无法实现的。Android 13 内置对 LE 音频的支持,因此,开发者应该能够在兼容设备上免费获取相关的新功能。

MIDI 2.0

Android 13 可支持新的 MIDI 2.0 标准,包括能够通过 USB 连接 MIDI 2.0 硬件。此新版标准有诸多优点,如提升控制器精度、改善对非西方地区语调的支持,以及提高使用单一音符控制器时的表现力。

隐私权和安全

更安全地导出上下文注册的接收器

为了帮助提高运行时接收器的安全性,Android 13 允许您指定您应用中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见。如果导出广播接收器,其他应用将可以向您的应用发送不受保护的广播。此导出配置在以 Android 13 或更高版本为目标平台的应用中可用,有助于防止一个主要的应用漏洞来源。

在以前的 Android 版本中,设备上的任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。

要实现此安全增强措施,请执行以下操作:

  1. 启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改。

  2. 在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播,如以下代码段所示:

    KotlinJava

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // This broadcast receiver should be able to receive broadcasts from other apps.
    // This option causes the same behavior as setting the broadcast receiver's
    // "exported" attribute to true in your app's manifest.
    context.registerReceiver(sharedBroadcastReceiver, intentFilter,
    RECEIVER_EXPORTED)

    // For app safety reasons, this private broadcast receiver should **NOT**
    // be able to receive broadcasts from other apps.
    context.registerReceiver(privateBroadcastReceiver, intentFilter,
    RECEIVER_NOT_EXPORTED)

注意:如果启用了 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改,则必须为每个广播接收器指定 RECEIVER_EXPORTEDRECEIVER_NOT_EXPORTED。否则,当您尝试注册广播接收器时,系统会抛出 SecurityException

为了帮助检测这种情况,Android Studio 将会采用一个 lint 规则,而即将发布的 ContextCompat 将会检查接收器配置是否正确。

照片选择器

Android 13(API 级别 33)提供了全新的照片选择器体验。应用启动照片选择器时,用户可选择与应用分享特定图片和视频(如个人资料照片),而不是授予应用查看整个媒体库的权限。

照片选择器可为用户提供更好的隐私保护,因为您的应用无需声明任何运行时权限。此外,照片选择器还为应用提供内置标准化界面,从而打造更一致的用户体验。

注意:现在,我们推荐使用照片选择器来访问用户的照片和视频。

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

Android 13(API 级别 33)在 NEARBY_DEVICES 权限组中引入了一项新的运行时权限,它适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。这些应用在调用多个不同的 Wi-Fi API 时必须声明新的权限 NEARBY_WIFI_DEVICES。此外,只要应用不会通过 Wi-Fi API 推导物理位置,那么在以 Android 13 或更高版本为目标平台时,就无需声明 ACCESS_FINE_LOCATION 权限。

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

使用精确闹钟的新权限

如果您的应用以 Android 13 为目标平台,您可以使用自动授予应用的 USE_EXACT_ALARM 权限。不过,您的应用若要使用此权限,必须至少满足以下条件之一:

  • 您的应用是闹钟应用或计时器应用。
  • 您的应用是日历应用,可显示即将进行的活动的通知。

注意:即将推出的 Google Play 政策会阻止应用使用 USE_EXACT_ALARM 权限,除非应用满足前面列表中显示的任一情况。

如果您的应用设置了精确闹钟,但不符合前面列表中显示的任一情况,请改为继续声明 SCHEDULE_EXACT_ALARM 权限,并为用户拒绝授予您应用相应访问权限的情况做好准备

开发者可降级权限

从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可让您的应用执行增强隐私权的任务,如下所示:

  • 撤消未使用的权限。
  • 遵循权限最佳做法,从而提高用户信任度。您可能需要考虑向用户显示一个对话框,其中会显示您主动撤消的权限。

如需撤消特定运行时权限,请将该权限的名称传入 revokeSelfPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入 revokeSelfPermissionsOnKill()。撤消是异步发生的,会终止与您应用的 UID 相关联的所有进程。

注意:为了让系统设置表明您的应用不会访问特定权限组中的数据,您必须撤消该权限组中的所有权限。在这种情况下,调用 revokeSelfPermissionsOnKill() 会很有帮助。

为使系统撤消权限,必须终止与您的应用关联的所有进程。当您调用该 API 时,系统会确定何时可以安全终止这些进程。通常,系统会等待应用有较长时间在后台运行,而不是在前台运行时。

为了立即撤消权限,您需要手动终止所有相关进程。由于此操作会导致不良的用户体验,因此我们不建议这样做。

如需告知用户应用的权限被撤消,请在用户下次启动应用时显示一个对话框。此对话框可以包含撤消的权限列表。

APK 签名方案 v3.1

Android 13 可支持 APK 签名方案 v3.1,此方案在现有的 APK 签名方案 v3 的基础上进行了改进,解决了 APK 签名方案 v3 的一些已知问题。具体而言,v3.1 签名方案允许应用在单个 APK 中同时支持原始签名者和轮替签名者。此外,该方案还支持 SDK 版本定位功能,这会允许轮替定位到更高版本的平台。

v3.1 签名方案使用在 12L 或更低版本中无法识别的新分块 ID。因此,平台会应用以下签名者行为:

  • 搭载 Android 13 的设备会使用 v3.1 分块中的轮替签名者。
  • 搭载旧版 Android 的设备会忽略轮替签名者,而使用 v3.0 分块中的原始签名者。

尚未轮替其签名密钥的应用无需执行任何其他操作。每当这些应用选择轮替时,系统都会默认应用新的 v3.1 签名方案。

已经轮替并希望继续使用 v3.0 签名分块中的轮替签名密钥的应用需要更新其 apksigner 调用:

1
2
3
4
apksigner sign --ks keystore.jks |
--key key.pk8 --cert cert.x509.pem
--rotation-min-sdk-version API_LEVEL
[signer_options] app-name.apk

…其中 API_LEVEL 为 32 或更低的值。

改进了密钥库和 KeyMint 中的错误报告功能

对于生成密钥的应用,密钥库和 KeyMint 现在提供更加详细且更准确的错误指示器。我们在 java.security.ProviderException 下添加了一个异常类层次结构,包含了特定于 Android 的异常,其中包括 Keystore/KeyMint 错误代码,以及错误是否可重试。您还可以修改密钥生成方法和使用方法(签名、加密),以抛出新的异常。改进的错误报告并不仅限于生成密钥,现在应为您提供重试密钥生成所需的内容。

平板电脑和大屏设备支持

Android 13 基于 Android 12 中引入的平板电脑优化和 Android 12L 功能更新构建而成 - 包括针对系统界面的优化、更出色的多任务处理功能和改进的兼容模式。在测试过程中,请确保您的应用在平板电脑和其他大屏设备上拥有最佳显示效果。

如需详细了解新功能和测试内容,请参阅平板电脑和大屏设备支持页面。

图形

可编程的着色器

Android 13 添加了对可编程 RuntimeShader 对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果模糊以及拉伸滚动,并且 Android 13 使您能够为应用制作类似的高级效果。

媒体

预期音频路由

为了帮助媒体应用确定其音频的路由方式,我们在 AudioManager 类中添加了新的音频路由 API。新的 getAudioDevicesForAttributes() API 允许您检索可以用于播放指定音频的设备列表,添加了可帮助您了解音频流是否可以直接播放的 getDirectProfilesForAttributes()。使用这些新 API 可确定最适合用于您的音轨的 AudioFormat

无障碍功能

语音描述

Android 13(API 级别 33)引入了新的系统级无障碍功能偏好设置,允许用户跨所有应用启用音频说明。音频说明是一种额外的旁白轨道,其中会有一位讲述者在演示过程中进行讲解,描述在音频的自然停顿期间屏幕上发生的情况。应用可以通过使用 isAudioDescriptionRequested() 查询音频说明轨道来遵循用户对音频说明轨道的偏好设置,如以下代码段所示:

KotlinJava

1
2
3
4
5
6
7
8
9
private lateinit var accessibilityManager: AccessibilityManager

// In onCreate():
accessibilityManager = getSystemService(AccessibilityManager::class.java)

// Where your media player is initialized
if (accessibilityManager.isAudioDescriptionRequested) {
// User has requested to enable audio descriptions
}

应用可以通过向 AccessbilityManager 添加监听器来监控用户的偏好设置更改:

KotlinJava

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private val listener =
AccessibilityManager.AudioDescriptionRequestedChangeListener { enabled ->
// Preference changed; reflect its state in your media player
}

override fun onStart() {
super.onStart()

accessibilityManager.addAudioDescriptionRequestedChangeListener(mainExecutor, listener)
}

override fun onStop() {
super.onStop()

accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener)
}

核心功能

OpenJDK 11 更新

Android 13 开始刷新 Android 的核心库,以与 OpenJDK 11 LTS 版本保持一致,并增添了适合应用和平台开发者的库更新和 Java 11 语言支持。Android 13 中引入的核心库变更还可以通过 Google Play 系统更新到 ART Mainline 模块,供 Android 12 设备使用。

Android 13 包含对核心库的以下更改:

  • 支持将 var 关键字用于局部变量,以及用作参数 lambda。
  • String 类中的新方法:
    • isBlank()
    • lines()
    • repeat()
    • strip()
    • stripLeading()
    • stripTrailing()
  • 支持 Collection.toArray(IntFunction),以便更轻松地使集合适应数组。
  • 支持 java.utilOptionalOptionalDoubleOptionalIntOptionalLong 中的 ifPresentOrElse()isEmpty()orElseThrow()stream()
  • 扩展了对 SocketOptions 的支持,包括重复使用套接字。
  • NullReaderNullWriterInputStreamOutputStreamtransferTo()``Reader 功能,用于将读取的字符传输给 Writer
  • 添加了使用 Charsets 进行网址编码和解码的功能。
  • 适用于 FileReaderFileWriterPrintStreamPrintWriterCharset 功能。
  • ByteArrayInputOutputStream 以及 InputOutputStream 新增了 transferTo()readNBytes()readAllBytes()writeBytes() 函数。
  • java.lang.invoke.VarHandle 的运行时和编译器支持。
  • 在内部使用 VarHandlejava.util.concurrent 更新到 OpenJDK 11 API。