敬请期待 12L,这是一次将于明年年初面向大屏设备推出的功能投放。立即试用!

功能和 API 概览

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

有关新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档 - 新 API 会突出显示以方便查看。此外,如需了解平台变更可能会在哪些方面影响您的应用,请务必查看会影响以 Android 12 为目标平台的应用所有应用的 Android 12 行为变更。

用户体验

Material You

Android 12 引入了一种名为 Material You 的新设计语言,可帮助您构建更具个性化、更精美的应用。如需将所有最新的 Material Design 3 更新添加到您的应用中,请试用 Alpha 版 Material Design 组件

Material You

微件改进

Android 12 改进了现有的 Widgets API,以改善平台和启动器中的用户和开发者体验。我们编写了一个指南,帮助您确保您的微件与 Android 12 兼容并使用新功能对其进行更新。

如需了解详情,请参阅 Android 12 微件改进

富媒体内容插入

Android 12 引入了一个新的统一 API,可让您的应用从任何可用来源(剪贴板粘贴、键盘输入或拖放操作)接收富媒体内容。

如需了解详情,请参阅接收富媒体内容

应用启动画面 API

Android 12 为所有应用引入了新的应用启动动画,包括启动时的进入应用运动、显示应用图标的启动画面,以及向应用本身的过渡。如需了解详情,请参阅启动画面开发者指南

圆角 API

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

如需了解详情,请参阅圆角

富触感反馈体验

Android 12 扩展了各个工具,以期为界面事件创建信息触感反馈,为游戏打造令人愉悦的沉浸式效果,以及为提高工作效率提供注意力触感反馈。

致动器效果

Android 12 添加了低滴答声等具有表现力的效果,以便充分利用最新致动器的更宽频率带宽。现在,游戏开发者可以在游戏控制器中单独访问多个不同的致动器,以在多个致动器上同步提供相同的效果或实现不同的触感反馈效果。对于开发者,我们建议使用常量基元作为富触感反馈效果的构建块,常量用于增强界面事件,而触感反馈合成器用于对基元进行排序以获得更复杂的效果。这些 API 可以在 Pixel 4 设备上试用,我们会继续与设备制造商合作伙伴携手合作,共同为整个生态系统中的用户提供最新的触感反馈支持。

音频耦合触感反馈效果

Android 12 应用可使用手机的振动器从音频会话产生触感反馈。这可让您获得更身临其境的游戏和音频体验。例如,触感反馈效果增强的铃声有助于识别来电者,或者赛车游戏可以模拟在崎岖地形驾驶的感觉。

如需了解详情,请参阅 HapticGenerator 参考文档。

AppSearch

Android 12 引入了 AppSearch 作为一种系统服务,这是一种高性能设备上搜索引擎。AppSearch 可使应用对结构化数据建立索引,并使用内置的全文搜索功能对其进行搜索。此外,AppSearch 还支持原生搜索功能,例如高效的编入索引和检索、多语言支持和相关性排名。

在 AppSearch 中编入索引和进行搜索的示意图

AppSearch 有两种形式:本地索引,供与更早 Android 版本兼容的应用使用;中央索引,在 Android 12 中为整个系统维护。通过使用中央索引,您的应用可以通过系统预安装的智能组件将其数据显示在系统界面上。系统界面上会显示哪些数据取决于 OEM。此外,您的应用也可以与其他应用安全地共享数据,以便这些应用也能搜索这些数据。

阅读开发者指南详细了解 AppSearch,并开始将它与 AppSearch Jetpack 库一起使用,该库提供了对开发者友好的 API Surface 以及注释处理器支持。

游戏模式

借助 Game Mode API游戏模式干预项,您可以根据用户设置或游戏专用配置,通过确定性能或电池续航时间等特征的优先级来优化游戏内容。

如需了解详情,请参阅游戏模式

画中画 (PiP) 改进

Android 12 针对画中画模式引入了以下新功能:

  • 用于在手势导航中更流畅地过渡到画中画模式的新 API 标志

    在手势导航模式下向上滑动到主屏幕时,使用 setAutoEnterEnabled 标志更流畅地过渡到画中画模式。以前,Android 会等到“向上滑动转到主屏幕”动画结束,然后再淡入画中画窗口。

  • 用于为非视频内容停用无缝大小调整的新 API 标志

    在调整画中画窗口中的非视频内容的大小时,SeamlessResizeEnabled 标志可以提供更平滑的淡入淡出动画。以前,在画中画窗口中调整非视频内容的大小时会产生烦人的视觉伪影。

  • 退出画中画模式时更流畅的动画

    现在,SourceRectHint 标志重用于在退出画中画模式时实现更流畅的动画。退出时,系统会使用当前可用的 sourceRectHint 创建动画,无论它是用于进入画中画模式的原始 Rect,还是应用提供的更新后的 Rect

  • 支持新手势

    Android 12 现在支持对画中画窗口使用隐藏和“双指张合即可缩放”手势:

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

    • 用户现在可以使用“双指张合即可缩放”手势调整画中画窗口的大小。

如需详细了解会影响以 Android 12 或更高版本为目标平台的应用的新行为,请参阅画中画行为改进。有关实现此功能的说明,请参阅画中画支持

允许按来电重要性排名的新通话通知

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 还为粘性沉浸模式提供了向后兼容性行为

近期网址共享(仅限 Pixel)

现在,在 Pixel 设备上,用户可以直接通过“近期”屏幕分享最近浏览的网页内容的链接。在某个应用中访问内容后,用户可以滑动到“近期”屏幕,并找到在其中查看了相应内容的应用,然后点按链接按钮来复制或分享网址。

如需了解详情,请参阅启用近期网址共享

安全和隐私设置

隐私信息中心

垂直时间轴显示了访问过位置信息的不同应用,以及访问发生的时间
图 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)起,使用 Keymaster 4.0 或更高版本的设备政策所有者 (DPO) 可以验证这些认证证书中的设备属性。从 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 会对常用即时通讯应用中收到的消息进行钓鱼式攻击检测。用户启用此功能后,系统会使用设备端机器学习技术来检测可疑活动。检测到此类消息时,系统会在即时通讯应用界面顶部显示安全叠加层来警告用户。例如,钓鱼式攻击检测可以警告用户存在以下潜在风险:

  • 可疑请求,例如发送验证码、款项或类似内容
  • 不受信任的网址
  • 恶意附件
  • 链接到恶意应用

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

开发者可以通过在应用清单文件中添加包含字符串 com.google.android.ALLOW_PHISHING_DETECTION 的新元数据标记来停用此功能。例如:

<manifest>
    <application android:name="com.messagingapp">
        <meta-data android:name="com.google.android.as.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

Quad Bayer 摄像头传感器支持

如今,许多 Android 设备都配备了超高分辨率摄像头传感器(通常采用 Quad 或 Nona Bayer 模式),这些传感器在图片质量和弱光性能方面提供了极大的灵活性。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 时,该 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 感知 (NAN) 增强功能

Android 12 增强了 Wi-Fi 感知功能:

  • 在搭载 Android 12(API 级别 31)及更高版本的设备上,您可以使用 onServiceLost() 回调,以便在应用因服务停止或移出范围而失去已发现的服务时发出警报。
  • 设置多个数据路径(NAN 数据路径)的方式将发生变化以提高效率。较低的版本使用 L2 消息功能来交换发起方的对等信息,由此导致了延迟。在搭载 Android 12 及更高版本的设备上,可以将响应方(服务器)配置为接受任何对等方,也就是说,它不需要预先知道发起方信息。这可加快数据路径启动,并只需一个网络请求即可实现多个点对点链接。
  • 为了防止框架因资源不足而拒绝发现请求或连接请求,在搭载 Android 12 及更高版本的设备上,您可以调用 WifiAwareManager.getAvailableAwareResources()。通过此方法的返回值,您可以获得可用数据路径的数量、可用发布会话的数量以及可用的订阅会话数量。

并发点对点 + 互联网连接

当以 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