关于Android12适配,看这篇就够了
⼀:功能和 API 概览
Android 12 ⾯向开发者引⼊了⼀些出⾊的新功能和 API。以下⼏部分内容可帮助您了解适⽤于您的应⽤的功能并开始使⽤相关 API。
有关新增、修改和移除的 API 的详细列表,请参阅 。如需详细了解新的 API,请访问 - 新 API 会突出显⽰以⽅便查看。此外,如需了解平台变更可能会在哪些⽅⾯影响您的应⽤,请务必查看会影响和的 Android 12 ⾏为变更。
新体验
微件改进
Android 12 改进了现有的 Widgets API,以改善平台和启动器中的⽤户和开发者体验。我们编写了⼀个指南,帮助您确保您的微件与Android 12 兼容并使⽤新功能对其进⾏更新。
企业知识管理
如需了解详情,请参阅 。
⾳频耦合触感反馈效果
Android 12 应⽤可使⽤⼿机的振动器产⽣来⾃⾳频会话的触感反馈。这可让您获得更⾝临其境的游戏和⾳频体验。例如,触感反馈效果增强的铃声有助于识别来电者,或者赛车游戏可以模拟在崎岖地形驾驶的感觉。
如需了解详情,请参阅 参考⽂档。
启动画⾯ API
Android 12 为所有应⽤引⼊了新的应⽤启动动画,包括启动时的进⼊应⽤运动、显⽰应⽤图标的启动画⾯,以及向应⽤本⾝的过渡。如需了解详情,请参阅。
允许按来电重要性排名的新通话通知
Android 12 为通话添加了新的通知样式 。使⽤此模板可让您的应⽤指明正在进⾏的通话的重要性,⽅法是在状态栏中显⽰⼀个显眼的条状标签,在其中显⽰通话的时间;⽤户可以点按此条状标签以返回他们的通话。
由于来电和进⾏中的通话对⽤户来说最为重要,因此这些通知在通知栏中排名最⾼。这种排名还让系统有可能将这些优先处理的通话转接到其他设备。
为所有类型的通话实现以下代码。
// Create a new call with the ur as caller.
val incoming_caller = Person.Builder()
.tName("Jane Doe")
.tImportant(true)
.build()
// Create a new call with the ur as caller.
Person incoming_caller = new Person.Builder()
.tName("Jane Doe")
.tImportant(true)
.build();
使⽤ 为来电创建通话样式通知。
/
/ Create a call style notification for an incoming call.
val builder = Notification.Builder(context, CHANNEL_ID)
.tContentIntent(contentIntent)
.tSmallIcon(smallIcon)
.tStyle(
Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
.addPerson(incoming_caller)
// Create a call style notification for an incoming call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
.tContentIntent(contentIntent)
.tSmallIcon(smallIcon)
.
tStyle(
Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
.addPerson(incoming_caller);
使⽤ 为进⾏中的通话创建通话样式通知。
// Create a call style notification for an ongoing call.
val builder = Notification.Builder(context, CHANNEL_ID)
.tContentIntent(contentIntent)
.tSmallIcon(smallIcon)
.tStyle(
Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
.addPerson(cond_caller)
/
/ Create a call style notification for an ongoing call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
.tContentIntent(contentIntent)
.tSmallIcon(smallIcon)
.tStyle(
Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
.addPerson(cond_caller);
使⽤ 为过滤来电创建通话样式通知。
// Create a call style notification for an ongoing call.
val builder = Notification.Builder(context, CHANNEL_ID)
放鱼
.tContentIntent(contentIntent)
.
tSmallIcon(smallIcon)
.tStyle(
Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
.addPerson(cond_caller)
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
.tContentIntent(contentIntent)
.tSmallIcon(smallIcon)
剪纸简单.tStyle(
Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
.addPerson(cond_caller);
通知的丰富图⽚⽀持
在 Android 12 中,您现在可以通过在 和 通知中提供动画图⽚来丰富应⽤的通知体验。此外,您的应⽤现在还可以让⽤户在从通知栏回复消息时发送图⽚消息。
圆⾓ API
Android 12 引⼊了 和 ,它们可以提供圆⾓的半径和中⼼点。借助这些 API,您的应⽤可以避免界⾯元素在带有圆⾓的屏幕上被截断。
在您的应⽤中实现这些 API 时,它们对具有⾮圆⾓屏幕的设备没有影响。
如需实现此功能,请相对于应⽤的边界通过 RoundedCorner(int position) 获取 RoundedCorner 信息。如果应⽤未占据整个屏幕,则该 API 通过让圆⾓的中⼼点基于应⽤的窗⼝边界来应⽤圆⾓。
以下代码段展⽰了⼀个简单的⽰例,说明了⼀个应⽤通过根据来⾃ RoundedCorner 的信息设置视图
的外边距来避免界⾯截断。在本例中,它是右上⾓的圆⾓。
// Get the top-right rounded corner from WindowInts.
final WindowInts ints = getRootWindowInts();
final RoundedCorner topRight = RoundedCorner(POSITION_TOP_RIGHT);
if (topRight == null) {
return;
}
// Get the location of the clo button in window coordinates.
int [] location = new int[2];
final int buttonRightInWindow = location[0] + Width();
final int buttonTopInWindow = location[1];
// Find the point on the quarter circle with a 45 degree angle.
final int offt = (int) (Radius() * Math.Radians(45)));
final int topBoundary = Center().y - offt;
final int rightBoundary = Center().x + offt;
// Check whether the clo button exceeds the boundary.
if (buttonRightInWindow < rightBoundary && buttonTopInWindow > topBoundary) {
return;
}
// Set the margin to avoid truncating.
int [] parentLocation = new int[2];
getLocationInWindow(parentLocation);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) LayoutParams();
lp.rightMargin = Math.max(buttonRightInWindow - rightBoundary, 0);
cloButton.tLayoutParams(lp);
画中画 (PiP) 改进
Android 12 针对画中画 (PiP) 模式引⼊了新功能。如需了解详情,请参阅。
沉浸模式下的⼿势导航改进
Android 12 简化了沉浸模式,使⼿势导航更易于操作且与其他活动体验(例如观看视频和阅读图书)更加⼀致。应⽤仍然可以在全屏游戏体验中,以免⽤户在玩游戏时意外退出游戏;所有其他全屏或沉浸式体验现在都允许⽤户通过滑动⼿势进⾏导航。
为了实现这⼀点,从 Android 12 开始,我们已弃⽤⾮粘性沉浸式体验(、)的现有⾏为。它们已被默
认⾏为 () 取代,即在隐藏系统栏后,允许使⽤滑动⼿势。此标志会根据模式显⽰不同的视觉和功能⾏为:
在“三按钮”模式下,视觉和功能⾏为与 Android 12 之前的版本中的沉浸模式相同。
在⼿势导航模式下,⾏为如下:
在视觉上,它与 Android 11 及更低版本中的沉浸模式相同。
从功能上讲,即使系统栏被隐藏,也允许使⽤⼿势;只需滑动屏幕⼀次便可调⽤系统返回操作,⽽ Android 11 需要滑动两次。下拉通知栏或转到主屏幕⽆需另外滑动屏幕。
Android 12 的粘性沉浸模式 () 没有任何变化。请注意此功能的以下向后兼容性:
网名怎样取好听
如果应⽤以 Android 11 及更低版本为⽬标平台,则在 Android 12 上运⾏时:
BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 展⽰出的功能和呈现出的视觉效果相同。
默认值会映射到 。
如果应⽤以 Android 12 为⽬标平台,则在 Android 11(API 级别 30)及更低版本上运⾏时:
展⽰出的功能和呈现出的视觉效果应该是相同的,但 映射到 的情况除外。
务必更新您的 SDK 级别,以获得新的默认设置 ()。否则, 仍然是默认设置。
富媒体内容插⼊
Android 12 引⼊了⼀个新的统⼀ API,可让您从任何可⽤来源(剪贴板、键盘或拖放操作)接收富媒体内容。
如需了解详情,请参阅。
摄像头
Quad Bayer 摄像头传感器⽀持
如今,许多 Android 设备都配备了超⾼分辨率摄像头传感器(通常采⽤ Quad/Nona Bayer 模式),这些传感器在图⽚质量和弱光性能⽅⾯提供了极⼤的灵活性。Android 12 引⼊了新的平台 API,可让第三⽅应⽤充分利⽤这些多功能传感器。 ⽀持这些传感器的独特⾏为,并且考虑到它们在全分辨率或“最⼤分辨率”模式下⽽不是“默认”模式下运⾏时可能⽀持不同的流配置和组合。
图形和图⽚
让应⽤能够直接访问 Tombstone 跟踪记录
从 Android 12 开始,您可以通过 ⽅法以的形式访问应⽤的原⽣代码崩溃 Tombstone。协议缓冲区使⽤进⾏序列化。以前,只有通
过 (adb) 才能访问此信息。
以下⽰例说明了如何在您的应⽤中实现此功能:
ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = HistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5); for ( ApplicationExitInfo aei: exitReasons ) {
if ( Reason() == REASON_CRASH_NATIVE ) {
// Get the tombstone input stream.
InputStream tombstoneInputStream = TraceInputStream();
/
/ The tombstone parr built with protoc us the tombstone schema, then pars the trace.
Tombstone tombstone = Tombstone.parFrom(trace);
}
}
AVIF 图⽚⽀持
Android 12 引⼊了对使⽤ AV1 图⽚⽂件格式 (AVIF) 的图⽚的⽀持。AVIF 是⼀种使⽤ AV1 编码的图⽚和图⽚序列的容器格式。它利⽤了视频压缩的帧内编码内容。与以前的图⽚格式(例如 JPEG)相⽐,这种格式可显著提升相同⽂件⼤⼩下的图⽚质量。如需深⼊了解此格
式的优势,请参阅 Jake Archibald 的。
更简单的模糊处理、颜⾊滤镜及其他效果
Android 12 添加了新的 ,它可将常见的图⽚效果(如模糊处理、颜⾊滤镜、Android 着⾊器效果及更多效果)应⽤于 和渲染层次结构。效果可以组合为连锁效果(构成⼀种内外效果)或混合效果。由于处理能⼒有限,不同的 Android 设备可能⽀持该功能,也可能不⽀持。
也可以通过调⽤ 将效果应⽤于 View 的底层 。
如需实现 RenderEffect,请编写以下代码:
view.ateBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))
原⽣动画图⽚解码
在 Android 12 中,NDK API 已进⾏了扩展,可以对使⽤以下⽂件格式的图⽚的所有帧和时间数据进⾏解码:动画 和动画 ⽂件格式。在 Android 11 中引⼊该 API 时,该 API 仅从这些格式的动画中解码第⼀张图⽚。
使⽤ ImageDecoder(⽽⾮第三⽅库)可进⼀步,并从未来与安全性和性能相关的更新中受益。
如需详细了解该 API,请参阅 和 。
台下十年功媒体
兼容的媒体转码
Android 12 可以⾃动将设备上录制的 和 (HDR10 和 HDR10+)视频转码为 AVC (H.264),AVC (H.
264) 是与标准播放器⼴泛兼容的格式。因此,当现代编解码器可⽤且不会影响与旧应⽤的兼容性时,便会利⽤现代编解码器。
作文素材摘抄如需了解详情,请参阅。
性能等级
从 Android 12 开始,Android 引⼊了⼀种称为“性能等级”的标准。性能等级指定超出 Android 基准要求的硬件功能。每个 Android 设备都会声明其⽀持的性能等级。开发者可以在运⾏时检查设备的性能等级,并提供充分利⽤设备功能的升级体验。
如需了解详情,请参阅。
视频编码改进
Android 12 定义了⼀组标准键来控制视频编码的量化参数 (QP) 值,这样可让开发者避免供应商专⽤代码。
API 以及 中提供了这些新键。
灯科鱼
从 Android 12 开始,视频编码器强制执⾏⼀个最低质量阈值。这样可保证⽤户在对场景复杂性较⾼的视频进⾏编码时不会体验到极低的质量。
银耳的作用⾳频焦点
从 Android 12 开始,当⼀个应⽤在另⼀个应⽤具有焦点且正在播放⾳频的同时请求⾳频焦点时,框架会淡出正在播放⾳频的应⽤。
如需了解详情,请参阅。
MediaDrm 更新
为了确定当前的 MediaDrm API 是否需要安全的解码器组件,您必须按照以下步骤操作:
1. 创建 MediaDrm。
2. 打开会话以获取会话 ID。
3. 使⽤会话 ID 创建 MediaCrypto。
4. 调⽤ quiresSecureDecoderComponent(mimeType)。
借助新⽅法 requiresSecureDecoder(@NonNull String mime) 和 requiresSecureDecoder(@NonNull String mime, @SecurityLevel int level),您可以在创建 MediaDrm 后⽴即确定这⼀点。