功能和 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 的动态更新:使用 setOverrideLocaleConfig()getOverrideLocaleConfig() 方法在 LocaleManager 中动态更新应用在 设备的系统设置 中支持的语言列表。利用这种灵活性,您可以根据地区自定义支持的语言列表,运行 A/B 测试,或者如果您的应用利用服务器端推送进行本地化,则提供更新的语言环境列表。

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

语法变格 API

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

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

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

区域偏好设置

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

针对这些偏好的新 Android 设置菜单为用户提供了一个可发现且集中的位置来更改应用偏好设置。这些偏好设置还将在备份和还原过程中保留。一些 API 和意图(例如 getTemperatureUnitgetFirstDayOfWeek)授予您的应用读取用户偏好设置的权限,以便您的应用可以调整其显示信息的方式。您还可以注册 BroadcastReceiverACTION_LOCALE_CHANGED 上,以便在区域偏好设置更改时处理区域设置配置更改。

要查找这些设置,请打开“设置”应用,然后导航到系统 > 语言和输入 > 区域偏好设置

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

辅助功能

非线性字体缩放至 200%

从 Android 14 开始,系统支持字体缩放至 200%,为视力障碍用户提供更多符合 Web 内容可访问性指南 (WCAG) 的辅助功能选项。

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

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

启用设备的辅助功能设置中的最大字体大小以测试您的应用。

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

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

  1. 打开“设置”应用,然后导航到辅助功能 > 显示尺寸和文本
  2. 对于字体大小选项,点击加号 (+) 图标,直到启用最大字体大小设置,如随附此部分的图像所示。

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

请务必始终 以 sp 单位指定文本大小。当您的应用使用 sp 单位时,Android 可以应用用户首选的文本大小并进行适当缩放。

不要将 sp 单位用于填充或定义视图高度,假设存在隐式填充:使用非线性字体缩放,sp 尺寸可能不成比例,因此 4sp + 20sp 可能不等于 24sp。

转换缩放像素 (sp) 单位

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

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

使用 sp 单位进行 lineHeight

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

相机和媒体

图像的超 HDR

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

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

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

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

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

传感器内缩放

REQUEST_AVAILABLE_CAPABILITIES_STREAM_USE_CASECameraCharacteristics 中包含 SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW 时,您的应用可以使用高级传感器功能通过使用具有设置为 CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW 的流用例的 RAW 目标的 CaptureRequest 使裁剪的 RAW 流具有与完整视野相同的像素。通过实现请求覆盖控件,更新后的相机即使在其他相机控件准备好之前也能为用户提供缩放控制。

无损 USB 音频

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

开发者生产力和工具

凭据管理器

Android 14 添加了 凭据管理器 作为平台 API,并通过使用 Google Play 服务的 Jetpack 库 向 Android 4.4(API 级别 19)及更高版本的设备提供额外支持。凭据管理器旨在通过检索和存储用户配置的凭据提供程序的凭据的 API,简化用户的登录流程。凭据管理器在一个 API 中支持多种登录方法,包括用户名和密码、密码密钥以及联合登录解决方案(如“使用 Google 登录”)。

密码密钥 提供了许多优势。例如,密码密钥 基于行业标准构建,可以在不同的操作系统和浏览器生态系统中使用,并且可以与网站和应用程序一起使用。

有关更多信息,请参阅 凭据管理器和密码密钥文档 以及关于凭据管理器和密码密钥的 博文

健康连接

健康连接是用户健康和健身数据的设备内存储库。它允许用户在他们喜欢的应用程序之间共享数据,并提供一个集中位置来控制他们希望与这些应用程序共享哪些数据。

在运行 Android 14 之前版本的设备上,健康连接可作为 Google Play 商店中的应用程序下载。从 Android 14 开始,健康连接成为平台的一部分,并通过 Google Play 系统更新接收更新,无需单独下载。这样,健康连接可以频繁更新,并且您的应用程序可以依赖于在运行 Android 14 或更高版本的设备上提供健康连接。用户可以从设备的设置中访问健康连接,隐私控制集成到系统设置中。

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

健康连接在 Android 14 中包含一些新功能,例如锻炼路线,允许用户共享其锻炼的路线,这些路线可以在地图上可视化。路线定义为在一段时间内保存的一系列位置,您的应用程序可以将路线插入锻炼课程中,并将它们关联起来。为了确保用户对这些敏感数据拥有完全控制权,用户必须允许与其他应用程序共享单个路线。

有关更多信息,请参阅 健康连接文档 和关于 Android 健康的新功能 的博文。

OpenJDK 17 更新

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

以下功能和改进已包含在内

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

感谢 Google Play 系统更新(Project Mainline),超过 6 亿台设备能够接收包含这些更改的最新 Android 运行时 (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 作为您的键盘。

要试用它,首先在设置 > 开发者选项 > AiCore 设置 > 启用 Aicore 持久化中启用此功能。

接下来,在支持的应用中打开对话,以查看 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 还包括interpolate()方法在Path上。假设这两个路径具有相同的内部结构,则interpolate()方法会创建一个新的Path,其中包含该插值结果。此示例返回一个路径,其形状介于pathotherPath之间(.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 添加了对自定义网格的支持,这些网格可以定义为三角形三角形条带,并且可以选择进行索引。这些网格指定自定义属性、顶点跨度、varying以及用AGSL编写的顶点和片段着色器。

顶点着色器定义了 varying,例如位置和颜色,而片段着色器可以选择定义像素的颜色,通常是通过使用顶点着色器创建的 varying 来实现的。如果颜色由片段着色器提供,则会使用绘制网格时选择的混合模式与当前Paint颜色进行混合。Uniforms可以传递到片段和顶点着色器中,以提高灵活性。

Canvas 的硬件缓冲区渲染器

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