功能与 API 概览

Android 14 为开发者引入了强大的功能和 API。以下内容可帮助您了解应用的功能并开始使用相关 API。

如需获取已添加、已修改和已移除 API 的详细列表,请阅读API 差异报告。如需了解已添加 API 的详细信息,请访问 Android API 参考文档——对于 Android 14,请查找 API 级别 34 中添加的 API。要了解平台更改可能影响您的应用的领域,请务必查看 Android 14 行为变更,包括针对以 Android 14 为目标平台的应用针对所有应用

国际化

应用内语言偏好设置

Android 14 在 Android 13(API 级别 33)中引入的按应用语言功能的基础上,新增了以下功能:

  • 自动生成应用的 localeConfig:从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始,您可以将应用配置为自动支持按应用语言偏好设置。根据您的项目资源,Android Gradle 插件会生成 LocaleConfig 文件,并在最终清单文件中添加对它的引用,这样您就不再需要手动创建或更新该文件。AGP 会使用您的应用模块和任何库模块依赖项的 res 文件夹中的资源来确定要包含在 LocaleConfig 文件中的语言区域。

  • 动态更新应用的 localeConfig:使用 LocaleManager 中的 setOverrideLocaleConfig()getOverrideLocaleConfig() 方法,动态更新应用在设备的系统设置中支持的语言列表。利用此灵活性,您可以按地区自定义支持的语言列表、运行 A/B 实验,或者在应用利用服务器端推送进行本地化时提供更新的语言区域列表。

  • 输入法编辑器 (IME) 的应用语言可见性:IME 可以利用 getApplicationLocales() 方法检查当前应用的语言,并将 IME 语言与该语言匹配。

语法变体 API

有 30 亿人使用有性别的语言:这些语言中的语法类别(如名词、动词、形容词和介词)会根据您与之交谈或谈论的人或对象的性别而变化。传统上,许多有性别的语言使用阳性语法性别作为默认或通用性别。

以错误的语法性别称呼用户(例如以阳性语法性别称呼女性)可能会对其表现和态度产生负面影响。相反,使用正确反映用户语法性别的语言界面可以提高用户参与度,并提供更个性化、听起来更自然的用户体验。

为了帮助您为有性别的语言构建以用户为中心的界面,Android 14 引入了语法变体 API,它允许您在不重构应用的情况下添加对语法性别的支持。

区域偏好设置

区域偏好设置允许用户个性化温度单位、一周的第一天和数字系统。居住在美国的欧洲人可能更喜欢摄氏温度单位而非华氏温度,并且希望应用将周一视为一周的开始,而不是美国默认的周日。

针对这些偏好设置的新 Android 设置菜单为用户提供了可发现的集中位置来更改应用偏好设置。这些偏好设置还会通过备份和恢复进行保留。多个 API 和 Intent(例如 getTemperatureUnitgetFirstDayOfWeek)授予您的应用读取用户偏好设置的权限,因此您的应用可以调整其信息显示方式。您还可以注册一个 BroadcastReceiver,以响应 ACTION_LOCALE_CHANGED,从而处理区域偏好设置更改时的语言区域配置更改。

要查找这些设置,请打开“设置”应用,然后依次前往 System > Languages & input > Regional preferences

Android 系统设置中的“区域偏好设置”屏幕。
Android 系统设置中“区域偏好设置”的温度选项。

无障碍功能

非线性字体缩放至 200%

从 Android 14 开始,系统支持将字体缩放至最高 200%,为低视力用户提供了额外的无障碍选项,符合网页内容无障碍指南 (WCAG)

为防止屏幕上的大文本元素缩放过大,系统会应用非线性缩放曲线。这种缩放策略意味着大文本不会以与小文本相同的速率缩放。非线性字体缩放有助于保持不同大小元素之间的比例层级结构,同时缓解高倍线性文本缩放导致的问题(例如文本被截断或由于显示尺寸过大而导致文本难以阅读)。

使用非线性字体缩放测试您的应用

在设备的无障碍设置中启用最大字体大小来测试您的应用。

如果您已经使用缩放像素 (sp) 单位来定义文本大小,那么这些额外的选项和缩放改进会自动应用于您应用中的文本。但是,您仍应启用最大字体大小 (200%) 执行 UI 测试,以确保您的应用正确应用字体大小,并且能够在不影响可用性的情况下适应更大的字体大小。

要启用 200% 字体大小,请按以下步骤操作:

  1. 打开“设置”应用,然后依次前往 Accessibility > Display size and text
  2. 对于字体大小选项,点按加号 (+) 图标,直到启用最大字体大小设置,如本节随附的图片所示。

对文本大小使用缩放像素 (sp) 单位

请记住始终以 sp 单位指定文本大小。当您的应用使用 sp 单位时,Android 可以应用用户偏好的文本大小并进行适当缩放。

不要对内边距使用 sp 单位,也不要假设隐式内边距来定义视图高度:由于非线性字体缩放,sp 尺寸可能不成比例,因此 4sp + 20sp 可能不等于 24sp。

转换缩放像素 (sp) 单位

使用 TypedValue.applyDimension() 将 sp 单位转换为像素,并使用 TypedValue.deriveDimension() 将像素转换为 sp。这些方法会自动应用适当的非线性缩放曲线。

避免使用 Configuration.fontScaleDisplayMetrics.scaledDensity 硬编码方程式。由于字体缩放是非线性的,因此 scaledDensity 字段不再准确。fontScale 字段应仅用于信息目的,因为字体不再以单个标量值进行缩放。

对 lineHeight 使用 sp 单位

始终使用 sp 单位而非 dp 定义 android:lineHeight,以便行高随文本一起缩放。否则,如果您的文本是 sp 而 lineHeight 是 dp 或 px,它将不会缩放并看起来很拥挤。TextView 会自动校正 lineHeight,以保留您预期的比例,但前提是 textSizelineHeight 都以 sp 单位定义。

相机和媒体

图像的 Ultra HDR

标准动态范围 (SDR) 与高动态范围 (HDR) 图像质量的图示。

Android 14 新增了对高动态范围 (HDR) 图像的支持,这些图像在拍照时保留了更多来自传感器的信息,从而实现鲜艳的色彩和更高的对比度。Android 使用 Ultra HDR 格式,该格式完全向后兼容 JPEG 图像,允许应用与 HDR 图像无缝交互,并根据需要以标准动态范围 (SDR) 显示它们。

当您的应用选择通过清单条目或在运行时通过调用 Window.setColorMode() 为其 Activity Window 使用 HDR UI 时,框架会自动在 UI 中以 HDR 渲染这些图像。您还可以在支持的设备上捕捉压缩的 Ultra HDR 静止图像。从传感器恢复的颜色越多,后期编辑就越灵活。与 Ultra HDR 图像关联的 Gainmap 可用于使用 OpenGL 或 Vulkan 渲染它们。

相机扩展中的缩放、对焦、后视图等功能

Android 14 升级并改进了相机扩展,允许应用处理更长的处理时间,从而通过支持设备上的计算密集型算法(如弱光摄影)改进图像。这些功能为用户在使用相机扩展功能时提供了更强大的体验。这些改进的示例包括:

传感器内变焦

CameraCharacteristics 中的 REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASE 包含 SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW 时,您的应用可以使用高级传感器功能,通过使用将流用例设置为 CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW 的 RAW 目标 CaptureRequest,为裁剪的 RAW 流提供与全视场相同的像素。通过实现请求覆盖控制,更新后的相机甚至在其他相机控制准备好之前,就能为用户提供变焦控制。

无损 USB 音频

Android 14 增加了对无损音频格式的支持,可通过 USB 有线耳机提供发烧友级别的体验。您可以使用 AudioMixerAttributes 类查询 USB 设备的优选混音器属性,注册混音器属性更改的监听器,并配置混音器属性。此类表示音频混音器的格式(例如通道掩码、采样率)和行为。该类允许直接发送音频,无需混音、音量调整或处理效果。

开发者生产力和工具

Credential Manager

Android 14 将 Credential Manager 添加为平台 API,并通过使用 Google Play 服务的 Jetpack 库,将支持扩展到 Android 4.4(API 级别 19)设备。Credential Manager 旨在通过 API 简化用户登录,这些 API 可使用用户配置的凭据提供程序检索和存储凭据。Credential Manager 在一个 API 中支持多种登录方法,包括用户名和密码、通行密钥以及联合登录解决方案(如“使用 Google 登录”)。

通行密钥具有许多优势。例如,通行密钥基于行业标准构建,可跨不同操作系统和浏览器生态系统工作,并且可用于网站和应用。

如需了解更多信息,请参阅 Credential Manager 和通行密钥文档以及关于 Credential Manager 和通行密钥的博文

健康连接

Health Connect 是一个设备端存储库,用于存储用户健康和健身数据。它允许用户在他们喜欢的应用之间共享数据,并且在一个地方控制他们想要与这些应用共享哪些数据。

在运行 Android 14 之前版本的设备上,Health Connect 可作为应用在 Google Play 商店下载。从 Android 14 开始,Health Connect 是平台的一部分,并通过 Google Play 系统更新接收更新,无需单独下载。通过此功能,Health Connect 可以频繁更新,您的应用可以依赖 Health Connect 在运行 Android 14 或更高版本的设备上可用。用户可以从设备设置中访问 Health Connect,其隐私控制已集成到系统设置中。

在运行 Android 14 或更高版本的设备上,用户无需单独下载应用即可开始使用 Health Connect。
用户可以通过系统设置控制哪些应用可以访问他们的健康和健身数据。

Health Connect 在 Android 14 中包含多项新功能,例如运动路线,允许用户分享他们的锻炼路线,该路线可以在地图上可视化。路线定义为在一段时间内保存的位置列表,您的应用可以将路线插入到锻炼会话中,将它们关联起来。为确保用户对这些敏感数据拥有完全控制权,用户必须允许与其他应用共享单独的路线。

如需了解更多信息,请参阅 Health Connection 文档以及关于Android Health 新功能的博文。

OpenJDK 17 更新

Android 14 继续刷新 Android 核心库的工作,使其与最新的 OpenJDK LTS 版本中的功能保持一致,包括库更新以及对应用和平台开发者的 Java 17 语言支持。

以下是包含的功能和改进:

  • 更新了大约 300 个 java.base 类以支持 Java 17。
  • 文本块,它向 Java 编程语言引入了多行字符串字面量。
  • instanceof 的模式匹配,它允许对象在 instanceof 中被视为具有特定类型,而无需任何额外的变量。
  • 密封类,它允许您限制哪些类和接口可以扩展或实现它们。

得益于Google Play 系统更新(Project Mainline),超过 6 亿台设备已启用接收包含这些更改的最新 Android Runtime (ART) 更新。这是我们致力于为应用提供跨设备更一致、更安全的环境,并独立于平台版本向用户提供新功能和能力的一部分。

Java 和 OpenJDK 是 Oracle 和/或其附属公司的商标或注册商标。

应用商店改进

Android 14 引入了多个 PackageInstaller API,允许应用商店改善其用户体验。

在下载前请求安装批准

安装或更新应用可能需要用户批准。例如,当安装程序使用 REQUEST_INSTALL_PACKAGES 权限尝试安装新应用时。在之前的 Android 版本中,应用商店只能在 APK 写入安装会话且会话提交后请求用户批准。

从 Android 14 开始,requestUserPreapproval() 方法允许安装程序在提交安装会话之前请求用户批准。此改进允许应用商店推迟下载任何 APK,直到用户批准安装后。此外,一旦用户批准安装,应用商店可以在后台下载并安装应用,而不会中断用户。

声明对未来更新的责任

setRequestUpdateOwnership() 方法允许安装程序向系统指示,它打算负责其正在安装的应用的未来更新。此功能支持更新所有权强制执行,这意味着只有更新所有者才能自动更新应用。更新所有权强制执行有助于确保用户只从预期的应用商店接收更新。

任何其他安装程序,包括使用 INSTALL_PACKAGES 权限的安装程序,都必须获得明确的用户批准才能安装更新。如果用户决定从其他来源继续更新,则更新所有权将丢失。

在干扰较小的时间更新应用

应用商店通常希望避免更新正在积极使用的应用,因为这会导致应用的运行进程被终止,从而可能中断用户正在进行的操作。

从 Android 14 开始,InstallConstraints API 为安装程序提供了一种方法,以确保其应用更新在适当的时机进行。例如,应用商店可以调用 commitSessionAfterInstallConstraintsAreMet() 方法,以确保只有在用户不再与相关应用交互时才提交更新。

无缝安装可选分割

通过分割 APK,应用的功能可以作为单独的 APK 文件交付,而不是作为单一的 APK。分割 APK 允许应用商店优化不同应用组件的交付。例如,应用商店可能会根据目标设备的属性进行优化。PackageInstaller API 自 API 级别 22 引入以来一直支持分割。

在 Android 14 中,setDontKillApp() 方法允许安装程序指示在安装新分割时,不应终止应用的运行进程。应用商店可以使用此功能在用户使用应用时无缝安装应用的新功能。

应用元数据捆绑包

从 Android 14 开始,Android 软件包安装程序允许您指定应用元数据,例如数据安全实践,以包含在 Google Play 等应用商店页面上。

检测用户何时截取设备屏幕截图

为了创建更标准化的屏幕截图检测体验,Android 14 引入了保护隐私的屏幕截图检测 API。此 API 允许应用按 Activity 注册回调。当用户在该 Activity 可见时截取屏幕截图时,将调用这些回调并通知用户。

用户体验

分享表单自定义操作和改进排名

Android 14 更新了系统分享表单,以支持自定义应用操作和为用户提供更具信息量的预览结果。

添加自定义操作

在 Android 14 中,您的应用可以向其调用的系统分享表单添加自定义操作

分享表单上自定义操作的屏幕截图。

改进直接分享目标的排名

Android 14 使用来自应用的更多信号来确定直接分享目标的排名,从而为用户提供更有用的结果。要为排名提供最有用的信号,请遵循改进直接分享目标排名的指导。通信应用还可以报告传出和传入消息的快捷方式使用情况

分享表单中的“直接分享”行,如 1 所示

支持预测性返回的内置和自定义动画

视频:预测性返回动画

Android 13 引入了预测性返回主页动画,该动画位于开发者选项之后。在受支持的应用中使用此开发者选项启用时,向后滑动会显示一个动画,指示返回手势将退出应用并返回主屏幕。

Android 14 包含针对预测性返回的多项改进和新指导:

在此 Android 14 预览版发布时,预测性返回的所有功能仍位于开发者选项之后。请参阅开发者指南,了解如何将您的应用迁移到预测性返回,以及创建自定义应用内过渡的开发者指南

大屏设备制造商按应用替换

按应用替换功能使设备制造商能够更改应用在大屏幕设备上的行为。例如,FORCE_RESIZE_APP 替换功能指示系统调整应用大小以适应显示尺寸(避免尺寸兼容模式),即使在应用清单中设置了 resizeableActivity="false" 也是如此。

替换旨在改善大屏幕上的用户体验。

新的清单属性使您能够为您的应用禁用某些设备制造商的替换。

大屏用户按应用替换

按应用替换功能会更改应用在大屏幕设备上的行为。例如,OVERRIDE_MIN_ASPECT_RATIO_LARGE 设备制造商替换功能会将应用纵横比设置为 16:9,而无论应用的配置如何。

Android 14 QPR1 允许用户通过大屏幕设备上的新设置菜单应用按应用替换。

应用屏幕共享

应用屏幕共享允许用户在屏幕内容录制期间共享应用窗口而不是整个设备屏幕。

通过应用屏幕共享,状态栏、导航栏、通知和其他系统 UI 元素将从共享显示中排除。仅共享所选应用的内容。

应用屏幕共享通过允许用户运行多个应用但限制内容共享到一个应用来提高生产力和隐私性。

Pixel 8 Pro 上的 Gboard 中的 LLM 驱动的智能回复

在搭载 12 月功能更新的 Pixel 8 Pro 设备上,开发者可以试用 Gboard 中由 Google Tensor 上运行的设备端大型语言模型 (LLM) 提供支持的更高质量的智能回复。

此功能在 WhatsApp、Line 和 KakaoTalk 中以有限预览版提供,支持美国英语。它需要使用 Pixel 8 Pro 设备并以 Gboard 作为键盘。

要试用此功能,请首先在 Settings > Developer Options > AiCore Settings > Enable Aicore Persistent 中启用此功能。

接下来,在受支持的应用中打开对话,即可在 Gboard 的建议栏中看到 LLM 驱动的智能回复,以响应收到的消息。

Gboard 利用设备端 LLM 提供更高质量的智能回复。

图形

路径可查询且可插值

Android 的 Path API 是一个功能强大且灵活的机制,用于创建和渲染矢量图形,能够描边或填充路径,从线段或二次或三次曲线构建路径,执行布尔运算以获得更复杂的形状,或同时进行所有这些操作。一个限制是无法了解 Path 对象中实际包含什么;对象创建后,其内部对调用者来说是不透明的。

要创建 Path,您可以调用 moveTo()lineTo()cubicTo() 等方法来添加路径段。但是,之前没有办法询问该路径的段是什么,因此您必须在创建时保留该信息。

从 Android 14 开始,您可以查询路径以找出其中包含什么。首先,您需要使用 Path.getPathIterator API 获取一个 PathIterator 对象:

Kotlin

val path = Path().apply {
    moveTo(1.0f, 1.0f)
    lineTo(2.0f, 2.0f)
    close()
}
val pathIterator = path.pathIterator

Java

Path path = new Path();
path.moveTo(1.0F, 1.0F);
path.lineTo(2.0F, 2.0F);
path.close();
PathIterator pathIterator = path.getPathIterator();

接下来,您可以调用 PathIterator 逐段迭代,检索每个段所需的所有数据。此示例使用 PathIterator.Segment 对象,它为您打包数据:

Kotlin

for (segment in pathIterator) {
    println("segment: ${segment.verb}, ${segment.points}")
}

Java

while (pathIterator.hasNext()) {
    PathIterator.Segment segment = pathIterator.next();
    Log.i(LOG_TAG, "segment: " + segment.getVerb() + ", " + segment.getPoints());
}

PathIterator 还有一个不分配内存的 next() 版本,您可以在其中传入一个缓冲区来保存点数据。

查询 Path 数据的一个重要用例是插值。例如,您可能想要在两条不同的路径之间进行动画处理(或变形)。为了进一步简化该用例,Android 14 还包含 Path 上的 interpolate() 方法。假设两条路径具有相同的内部结构,interpolate() 方法会创建一个具有插值结果的新 Path。此示例返回一个形状介于 pathotherPath 中间(线性插值为 0.5)的路径:

Kotlin

val interpolatedResult = Path()
if (path.isInterpolatable(otherPath)) {
    path.interpolate(otherPath, .5f, interpolatedResult)
}

Java

Path interpolatedResult = new Path();
if (path.isInterpolatable(otherPath)) {
    path.interpolate(otherPath, 0.5F, interpolatedResult);
}

Jetpack graphics-path 库也为早期版本的 Android 提供了类似的 API。

带有顶点和片段着色器的自定义网格

Android 长期以来一直支持使用自定义着色绘制三角形网格,但输入网格格式仅限于少数预定义的属性组合。Android 14 增加了对自定义网格的支持,这些网格可以定义为三角形三角形带,并且可以选择带索引。这些网格使用自定义属性、顶点步幅、可变以及用 AGSL 编写的顶点和片段着色器进行指定

顶点着色器定义了可变数据,例如位置和颜色,而片段着色器可以选择性地为像素定义颜色,通常通过使用顶点着色器创建的可变数据。如果片段着色器提供了颜色,那么在绘制网格时,它会使用所选的混合模式与当前的 Paint 颜色进行混合。Uniforms 可以传递给片段和顶点着色器以增加灵活性。

用于 Canvas 的硬件缓冲区渲染器

为了帮助使用 Android 的 Canvas API 将硬件加速绘制到 HardwareBuffer 中,Android 14 引入了 HardwareBufferRenderer。当您的用例涉及通过 SurfaceControl 与系统合成器通信以进行低延迟绘制时,此 API 尤其有用。