功能和 API 概览

Android 12 为开发者引入了许多很棒的新功能和 API。以下部分将帮助您了解应用的功能并开始使用相关的 API。

有关新增、修改和移除 API 的详细列表,请阅读API 差异报告。有关新 API 的详细信息,请访问Android API 参考 - 新 API 将突出显示以提高可见度。此外,要了解平台更改可能影响应用的哪些方面,请务必查看 Android 12 行为更改针对以 Android 12 为目标的应用针对所有应用

用户体验

Material You

Android 12 引入了一种名为Material You的新设计语言,可帮助您构建更个性化、更美观的应用。要将所有最新的 Material Design 3 更新引入您的应用,请尝试Material Design Components的 Alpha 版本。

Material You

窗口小部件改进

Android 12 重新设计了现有的窗口小部件 API,以改善平台和启动器中的用户和开发者体验。我们创建了一个指南,可帮助您确保您的窗口小部件与 Android 12 兼容,并使用新功能对其进行刷新。

有关更多信息,请参阅Android 12 窗口小部件改进

丰富的插入内容

Android 12 引入了一个新的统一 API,允许您的应用接收来自任何可用来源的丰富内容:剪贴板、键盘或拖放。

有关更多信息,请参阅接收丰富内容

应用启动画面 API

Android 12 为所有应用引入了新的应用启动动画,其中包括从启动点开始的进入应用动画、显示应用图标的启动画面以及过渡到应用本身。有关更多详细信息,请参阅启动画面开发者指南

圆角 API

Android 12 引入了RoundedCornerWindowInsets.getRoundedCorner(int position),它们提供了圆角的半径和中心点。

有关更多信息,请参阅圆角

丰富的触觉体验

Android 12 扩展了用于为 UI 事件创建信息丰富的触觉反馈、为游戏创建沉浸式和愉悦的效果以及为生产力创建注意力触觉的工具。

执行器效果

Android 12 添加了诸如低刻度之类的表达性效果,这些效果利用了最新执行器的更宽频率带宽。游戏开发者现在可以独立访问游戏控制器中的多个不同的执行器以同步提供相同的效果,或在多个执行器上提供不同的触觉效果。对于开发者,我们建议使用常量基元作为丰富触觉效果的构建块 - 常量用于增强 UI 事件,而触觉合成器用于为更复杂的效果排序基元。这些 API 可在 Pixel 4 设备上试用,我们正在继续与设备制造商合作伙伴合作,将最新的触觉支持带给整个生态系统中的用户。

音频耦合触觉效果

Android 12 应用可以使用手机的振动器生成源自音频会话的触觉反馈。这为更具沉浸感的游戏和音频体验提供了机会。例如,触觉增强铃声可以帮助识别呼叫者,或者驾驶游戏可以模拟崎岖地形的感受。

有关更多信息,请参阅HapticGenerator 参考文档。

AppSearch

Android 12 引入了 AppSearch,一个高性能的设备内置搜索引擎,作为系统服务。AppSearch 允许应用程序索引结构化数据,并使用内置的全文搜索功能对其进行搜索。此外,AppSearch 支持原生搜索功能,例如高效的索引和检索、多语言支持以及相关性排名。

Diagram illustrating indexing and searching within AppSearch

AppSearch 有两种形式:一个供您的应用程序使用的本地索引,与较旧版本的 Android 兼容;或者 Android 12 中为整个系统维护的中央索引。使用中央索引,您的应用程序可以允许其数据由系统预安装的智能组件显示在系统 UI 表面上。究竟哪些数据显示在系统 UI 表面上取决于 OEM。此外,您的应用程序可以安全地与其他应用程序共享数据,以允许它们也搜索这些数据。

开发者指南 中了解更多关于 AppSearch 的信息,并使用 AppSearch Jetpack 库 开始使用它,该库提供了一个开发者友好的 API 表面以及注解处理器支持。

游戏模式

游戏模式 API游戏模式干预 允许您通过优先考虑特性(例如基于用户设置或游戏特定配置的性能或电池寿命)来优化游戏体验。

更多信息,请参阅 游戏模式

画中画 (PiP) 建议和改进

Android 12 为 PiP 模式引入了以下改进

支持新的 PiP 手势

Android 12 现在支持 隐藏和捏合缩放手势 用于 PiP 窗口。

  • 要隐藏窗口,用户可以将窗口拖动到左侧或右侧边缘。要取消隐藏窗口,用户可以点击隐藏窗口的可见部分或将其拖出。

  • 用户现在可以使用捏合缩放来调整 PiP 窗口的大小。

Android 12 对全屏和 PiP 窗口之间的动画过渡进行了 重大视觉改进。我们强烈建议实施所有适用的更改;完成后,这些更改会自动扩展到大型屏幕(如折叠屏和平板电脑),无需任何其他操作。

这些功能如下:

新的电话呼叫通知,允许对传入呼叫的重要性进行排名

Android 12 为电话呼叫添加了新的通知样式 Notification.CallStyle。使用此模板,您的应用程序可以通过显示一个突出的芯片(在状态栏中显示呼叫时间)来指示活动呼叫的重要性;用户可以点击此芯片以返回其呼叫。

由于传入和正在进行的呼叫对用户至关重要,因此这些通知在阴影中获得最高排名。此排名还允许系统可能将这些优先呼叫转发到其他设备。

对所有类型的呼叫实施以下代码。

Kotlin

// Create a new call with the user as caller.
val incoming_caller = Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build()

Java

// Create a new call with the user as caller.
Person incoming_caller = new Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build();

使用 forIncomingCall() 为传入呼叫创建呼叫样式通知。

Kotlin

// Create a call style notification for an incoming call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller)

Java

// Create a call style notification for an incoming call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller);

使用 forOngoingCall() 为正在进行的呼叫创建呼叫样式通知。

Kotlin

// Create a call style notification for an ongoing call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller)

Java

// Create a call style notification for an ongoing call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller);

使用 forScreeningCall() 为筛选呼叫创建呼叫样式通知。

Kotlin

// Create a call style notification for screening a call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller)

Java

Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller);

通知的增强图像支持

在 Android 12 中,您现在可以通过在 MessagingStyle()BigPictureStyle() 通知中提供动画图像来丰富应用程序的通知体验。此外,您的应用程序现在可以允许用户在从通知栏回复消息时发送图像消息。

手势导航的沉浸模式改进

Android 12 整合了现有行为,使用户更容易 在沉浸模式下执行手势导航命令。此外,Android 12 提供了 粘性沉浸模式的向后兼容行为

最近使用的 URL 共享(仅限 Pixel)

在 Pixel 设备上,用户现在可以从最近使用的屏幕直接共享最近查看的网页内容的链接。在应用程序中访问内容后,用户可以滑动到最近使用的屏幕并找到他们查看内容的应用程序,然后点击链接按钮复制或共享 URL。

更多信息,请参阅 启用最近使用的 URL 共享

安全和隐私

隐私信息中心

A vertical timeline shows the different apps that have
         accessed location information, and at what time the accesses occurred
图 1. 位置使用屏幕,是隐私信息中心的一部分。

在运行 Android 12 或更高版本的受支持设备上,隐私信息中心屏幕会显示在系统设置中。在此屏幕上,用户可以访问单独的屏幕,这些屏幕显示应用程序何时访问位置、摄像头和麦克风信息。每个屏幕都显示了不同应用程序访问特定类型数据的时序。图 1 显示了位置信息的访问时序。

您的应用程序可以 为用户提供理由,以帮助他们了解您的应用程序为何访问位置、摄像头或麦克风信息。此理由可以显示在新隐私信息中心屏幕、应用程序的权限屏幕或两者上。

蓝牙权限

Android 12 引入了 BLUETOOTH_SCANBLUETOOTH_ADVERTISEBLUETOOTH_CONNECT 权限。这些权限使面向 Android 12 的应用程序更容易 与蓝牙设备交互,尤其是在应用程序不需要访问设备位置的情况下。

更新应用程序的蓝牙权限声明

要准备您的设备以面向 Android 12 或更高版本,请更新应用程序的逻辑。不要声明 一组旧的蓝牙权限,而是声明 一组更现代的蓝牙权限

权限组查找

在 Android 12 或更高版本上,您可以查询系统如何将平台提供的 权限 组织到权限组中。

隐藏应用程序叠加窗口

为了让开发者更好地控制用户与开发者应用程序交互时看到的内容,Android 12 引入了隐藏由具有 SYSTEM_ALERT_WINDOW 权限的应用程序绘制的叠加窗口的功能。

声明 HIDE_OVERLAY_WINDOWS 权限后,应用程序可以调用 setHideOverlayWindows() 来指示当应用程序自己的窗口可见时,应隐藏所有类型为 TYPE_APPLICATION_OVERLAY 的窗口。应用程序可能希望在显示敏感屏幕(例如交易确认流程)时执行此操作。

显示类型为 TYPE_APPLICATION_OVERLAY 的窗口的应用程序应考虑可能更适合其用例的替代方案,例如 画中画气泡

已知签名者权限保护标志

从 Android 12 开始,签名级权限knownCerts 属性允许您在声明时引用已知 签名证书 的摘要。

您的应用可以声明此属性并使用knownSigner标志,以允许设备和应用授予其他应用签名权限,而无需在设备制造和发货时对应用进行签名。

设备属性证明

Android 12 扩展了可以验证设备属性的应用集,这些属性位于证明证书中,当这些应用生成新密钥时。

从 Android 9(API 级别 28)开始,设备策略所有者 (DPO) 使用 Keymaster 4.0 或更高版本可以验证这些证明证书中的设备属性。从 Android 12 开始,任何以 Android 12(API 级别 31)或更高版本为目标的应用都可以使用setDevicePropertiesAttestationIncluded()方法执行此验证。

生成的设备属性包括以下Build字段

  • BRAND
  • DEVICE
  • MANUFACTURER
  • MODEL
  • PRODUCT

安全锁屏通知操作

从 Android 12 开始,Notification.Action.Builder 类支持setAuthenticationRequired()方法,该方法允许您的应用要求设备已解锁,然后您的应用才能调用给定的通知操作。此方法有助于为已锁定设备上的通知添加额外的安全层。

BiometricPrompt 的可本地化字符串

Android 12 引入了新的 API,以帮助您改进应用的生物识别身份验证用户体验。新的BiometricManager.Strings嵌套类包含getButtonLabel()getPromptMessage()getSettingName()方法,这些方法允许您的应用检索用户可读且本地化的按钮标签、提示消息或应用设置名称。使用这些标签创建更精确的面向用户的说明,这些说明特定于使用的生物识别身份验证方法,例如“使用面部解锁”或“使用您的指纹继续”。

消息应用中的网络钓鱼检测(仅限 Pixel)

当检测到可疑消息时,用户会看到类似这样的消息。

在支持的 Pixel 设备上,Android 12 会对在常用消息应用中接收到的消息运行网络钓鱼检测。系统使用设备上的机器学习来检测可疑活动。检测到后,系统会在消息应用的 UI 顶部显示安全叠加层以警告用户。例如,网络钓鱼检测可以警告用户以下潜在风险

  • 可疑请求,例如发送验证码、金钱或类似内容
  • 不可信的 URL
  • 恶意附件
  • 指向恶意应用的链接

除了警告用户外,叠加层还允许用户举报可疑消息并提供有关系统发出的警告的反馈。

开发人员可以通过添加一个新的元数据标签(包括字符串com.google.android.ALLOW_PHISHING_DETECTION)到他们的应用清单文件中来选择退出此功能。例如

<manifest>
    <application android:name="com.messagingapp">
        <meta-data android:name="com.google.android.ALLOW_PHISHING_DETECTION" android:value="false" />

    </application>
</manifest>

媒体

兼容媒体转码

从 Android 12(API 级别 31)开始,系统可以自动将设备上录制的HEVC(H.265)HDR(HDR10 和 HDR10+)视频转码为 AVC (H.264),这是一种与标准播放器广泛兼容的格式。这在可用时利用了现代编解码器,而不会影响与旧版应用程序的兼容性。

有关更多详细信息,请参阅兼容媒体转码

性能类别

Android 12 引入了一种称为“性能类别”的标准。性能类别指定了超出 Android 基线要求的硬件功能。每个 Android 设备都会声明其支持的性能类别。开发人员可以在运行时检查设备的性能类别,并提供充分利用设备功能的升级体验。

有关更多详细信息,请参阅性能类别

视频编码改进

Android 12 定义了一组用于控制视频编码量化参数 (QP) 值的标准密钥,允许开发人员避免使用特定于供应商的代码。

新的密钥可在MediaFormat API 和NDK 媒体库中使用。

从 Android 12 开始,视频编码器会强制执行最低质量阈值。这保证了用户在使用高场景复杂度编码视频时不会遇到极低的质量。

音频焦点

从 Android 12(API 级别 31)开始,当一个应用请求音频焦点而另一个应用已获得焦点并正在播放时,系统会淡出正在播放的应用。

有关更多详细信息,请参阅Android 12 及更高版本中的音频焦点

MediaDrm 更新

为了确定当前MediaDrm API 是否需要安全解码器组件,您必须按照以下步骤操作

  1. 创建一个MediaDrm
  2. 打开一个会话以获取会话 ID。
  3. 使用会话 ID 创建一个MediaCrypto
  4. 调用MediaCrypto.requiresSecureDecoderComponent(mimeType)

使用新方法requiresSecureDecoder(@NonNull String mime)requiresSecureDecoder(@NonNull String mime, @SecurityLevel int level),您可以在创建MediaDrm后立即确定这一点。

相机

Camera2 供应商扩展

许多设备制造商合作伙伴都构建了自定义相机扩展(例如散景、HDR、夜间模式等),他们希望应用使用这些扩展在其设备上创建差异化体验。CameraX 库已支持这些自定义供应商扩展。在 Android 12 中,这些供应商扩展现在直接在平台中公开。

此新增功能有助于具有复杂Camera2实现的应用利用供应商扩展,而无需对旧版代码进行重大更改。Camera2 扩展 API 公开了与 CameraX 中相同的扩展集,并且这些扩展已在许多不同的设备上得到支持,因此您可以无需任何其他配置即可使用它们。

有关更多信息,请参阅CameraExtensionCharacteristics

四拜耳相机传感器支持

如今,许多 Android 设备都配备了超高分辨率相机传感器,通常采用四拜耳或九拜耳模式,这些传感器在图像质量和低光照性能方面提供了极大的灵活性。Android 12 引入了新的平台 API,允许第三方应用充分利用这些多功能传感器。新的 API支持这些传感器的独特行为,并考虑到在以全分辨率或“最大分辨率”模式运行时,它们可能支持不同的流配置和组合,而在“默认”模式下则不同。

图形和图像

为应用提供对 tombstone 跟踪的直接访问权限

从 Android 12 开始,您可以通过ApplicationExitInfo.getTraceInputStream()方法访问应用的原生崩溃 tombstone 作为协议缓冲区。协议缓冲区使用此模式进行序列化。以前,获取此信息的唯一方法是通过Android 调试桥 (adb)。

有关更多信息,请参阅为应用提供对 tombstone 跟踪的直接访问权限

AVIF 图像支持

Android 12 引入了对使用 AV1 图像文件格式 (AVIF) 的图像的支持。AVIF 是一种用于图像和使用 AV1 编码的图像序列的容器格式。AVIF 利用了视频压缩中帧内编码内容的优势。与 JPEG 等旧版图像格式相比,这显着提高了相同文件大小的图像质量。有关此格式优势的深入了解,请参阅 Jake Archibald 的博文

更轻松的模糊、颜色滤镜和其他效果

Android 12 添加了新的RenderEffect,它将常见的图形效果(如模糊、颜色滤镜、Android 着色器效果等)应用于View和渲染层次结构。效果可以组合为链式效果(组合内部和外部效果)或混合效果。由于处理能力有限,不同的 Android 设备可能支持也可能不支持此功能。

还可以通过调用View.setRenderEffect(RenderEffect)将效果应用于View的基础RenderNode

要实现RenderEffect

view.setRenderEffect(RenderEffect.createBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))

原生动画图像解码

在 Android 12 中,NDK ImageDecoder API 已扩展到解码使用动画GIF和动画WebP文件格式的图像的所有帧和时间数据。在 Android 11 中引入此 API 时,它仅解码了这些格式动画中的第一张图像。

使用 ImageDecoder 替代第三方库,以进一步 减小 APK 大小 并受益于未来与安全性和性能相关的更新。

有关 API 的更多详细信息,请参阅 API 参考GitHub 上的示例

连接性

保持伴侣应用唤醒状态

为了支持伴侣应用需要保持运行以管理设备的需求,Android 12 引入了执行以下操作的 API

  • 使您能够在伴侣设备在范围内时唤醒应用。
  • 保证进程在设备保持在范围内时继续运行。

要使用这些 API,您的设备必须使用 伴侣设备管理器 连接。有关更多信息,请参阅 CompanionDeviceManager.startObservingDevicePresence()CompanionDeviceService.onDeviceAppeared()

伴侣设备管理器配置文件

一个使用伴侣设备配置文件在一个请求中请求多个权限的权限对话框。

Android 12(API 级别 31 及更高版本)上的合作伙伴应用在连接到手表时可以使用伴侣设备配置文件。使用配置文件通过将特定于设备类型的权限集的授予捆绑到一个步骤中来简化注册过程。

一旦设备连接,这些捆绑的权限就会授予伴侣应用,并且仅在设备关联时有效。删除应用或移除关联会移除权限。

有关更多信息,请参阅 AssociationRequest.Builder.setDeviceProfile()

带宽估计改进

在 Android 12 中,getLinkDownstreamBandwidthKbps()getLinkUpstreamBandwidthKbps() 提供的带宽估计功能针对 Wi-Fi 和蜂窝连接进行了改进。现在返回的值表示用户在设备上所有应用中,针对每个运营商或 WiFi SSID、网络类型和信号强度计算出的所有时间加权平均吞吐量。这可以返回更准确和更现实的预期吞吐量估计,在应用冷启动时提供估计,并且与使用其他吞吐量估计方法相比,需要更少的循环。

Wi-Fi Aware(NAN)增强功能

Android 12 添加了一些对 Wi-Fi Aware 的增强功能

  • 在运行 Android 12(API 级别 31 及更高版本)的设备上,您可以使用 onServiceLost() 回调,以便在您的应用由于服务停止或超出范围而丢失已发现的服务时收到警报。
  • 设置多个数据路径(NAN 数据路径)的方式正在发生变化,以提高效率。早期版本使用 L2 消息传递来交换发起者的对等信息,这会导致延迟。在运行 Android 12 及更高版本的设备上,可以配置响应方(服务器)以接受任何对等方,即它不需要预先知道发起方信息。这加快了数据路径的建立速度,并可以使用单个网络请求建立多个点对点链接。
  • 为了防止框架由于资源耗尽而拒绝发现或连接请求,在运行 Android 12 及更高版本的设备上,您可以调用 WifiAwareManager.getAvailableAwareResources()。此方法的返回值使您可以获取可用数据路径的数量、可用发布会话的数量以及可用订阅会话的数量。

并发点对点 + Internet 连接

当以 Android 12(API 级别 31 及更高版本)为目标的设备在具有硬件支持的设备上运行时,使用 点对点连接 在创建与对等设备的连接时不会断开您现有的 Wi-Fi 连接。要检查对此功能的支持,请使用 WifiManager.isMultiStaConcurrencySupported()

启用 NFC 支付的屏幕关闭

在以 Android 12 及更高版本为目标的应用中,您可以通过将 requireDeviceScreenOn 设置为 false 来在设备屏幕未开启的情况下启用 NFC 支付。有关屏幕关闭或锁定状态下 NFC 支付的更多信息,请参阅 屏幕关闭和锁定屏幕行为

存储

Android 12 引入了以下存储管理功能

核心功能

自动应用更新

Android 12 为使用 PackageInstaller API 的应用引入了 setRequireUserAction() 方法。此方法允许安装程序应用执行应用更新,而无需用户确认操作。

设备芯片组信息

Android 12 向 android.os.Build 添加了两个常量,通过 SDK 公开 SoC 芯片组供应商和型号信息。您可以分别通过调用 Build.SOC_MANUFACTURERBuild.SOC_MODEL 来检索此信息。

核心 Java API 的更新

根据开发者的请求和协作,我们在 Android 12 中添加了以下核心库

API
java.lang.Deprecated
java.lang.Byte
java.lang.Short
java.lang.Math
java.lang.StrictMath
java.util.Set copyOf()
java.util.Map copyOf()
java.util.List copyOf()
java.time.Duration
java.time.LocalTime