功能和API概述
Android 12为开发人员引入了很棒的新功能和API。以下各节可帮助您了解应用程序的功能,并开始使用相关的API。
有关新的,已修改的和已删除的API的详细列表,请阅读 API差异报告。有关新API的详细信息,请访问Android API参考-突出显示新API以提高可见性。另外,要了解平台更改可能影响您的应用程序的区域,请务必查看针对Android 12的应用程序和所有应用程序的Android 12行为更改。
用于接收内容的统一API
Android 12引入了新的统一API,可让您从任何可用来源(剪贴板,键盘或拖放)接收丰富的内容。
有关更多信息,请参阅用于接收内容的Unified API。
兼容的媒体转码
Android 12可以自动将设备上记录的HEVC(H.265)和 HDR(HDR10和HDR10 +)视频转码为AVC(H.264),该格式与标准播放器广泛兼容。当现代编解码器可用时,这可以利用它们,而不会牺牲与旧应用程序的兼容性。
有关更多详细信息,请参见兼容的媒体转码。
AVIF图像支持
Android 12引入了对使用AV1图像文件格式(AVIF)的图像的支持。AVIF是用于使用AV1编码的图像和图像序列的容器格式。它利用了来自视频压缩的帧内编码内容。与JPEG等较旧的图像格式相比,这可以显着提高相同文件大小的图像质量。要深入了解这种格式的优势,请参阅Jake Archibald的博客文章。
从音频产生触觉效果
Android 12应用程序可以使用手机的振动器从音频会话中生成触觉反馈。这提供了更沉浸式游戏和音频体验的机会。例如,触觉增强的铃声可以帮助识别呼叫者,或者驾驶游戏可以模拟崎terrain地形的感觉。
有关 更多信息,请参见HapticGenerator参考文档。
对动画GIF和WebP的本机ImageDecoder支持
在Android 12中,NDK ImageDecoderAPI已扩展为可以解码来自使用动画GIF和动画WebP文件格式的图像中的所有帧和定时数据。在Android 11中引入该API时,该API仅从这些格式的动画中解码出第一张图像。
使用ImageDecoder而不是第三方库来进一步减小APK的大小, 并从与安全性和性能有关的将来更新中受益。
有关API的更多详细信息,请参阅API参考和GitHub上的示例。
设备属性验证可在非DPC应用中使用
Android 12扩展了一组应用程序, 当这些应用程序生成新密钥时,这些应用程序可以验证证明证书中的设备属性。
从Android 9(API级别28)开始,使用 Keymaster 4.0或更高版本的设备策略所有者(DPO)可以验证这些证明证书中的设备属性。从Android 12开始,任何以Android 12为目标的应用都可以使用该 方法执行此验证 。setDevicePropertiesAttestationIncluded()
生成的设备属性包括以下 Build字段:
- BRAND
- DEVICE
- MANUFACTURER
- MODEL
- PRODUCT
Wi-Fi Aware(NAN)增强功能
Android 12对Wi-Fi Aware进行了一些增强:
在运行Android 12及更高版本的设备上,onServiceLost() 当由于服务停止或超出范围而使应用失去发现的服务时,您可以使用回调函数 来提醒您。
设置多个数据路径(NAN数据路径)的方式正在改变,以提高效率。早期版本使用L2消息交换来交换发起者的对等信息,从而引入了延迟。在运行Android 12或更高版本的设备上,可以将响应者(服务器)配置为接受任何对等方-也就是说,它不需要预先知道发起方信息。这加快了数据路径的启动速度,并且仅通过一个网络请求即可启用多个点对点链接。
为防止框架由于资源不足而拒绝发现或连接请求,请在运行Android 12及更高版本的设备上致电 WifiAwareManager.getAvailableAwareResources()。通过此方法的返回值,您可以获取可用数据路径的数量,可用发布会话的数量以及可用订阅会话的数量。
沉浸式手势导航改进
Android 12简化了沉浸式模式,使手势导航更加轻松,并且与观看视频和读书等活动的其余部分更加一致。应用仍然可以防止 全屏游戏体验中的意外手势,因此用户在玩游戏时不会意外退出游戏;现在,所有其他全屏或身临其境的体验都允许用户一键浏览手机。
要做到这一点,对于非粘性身临其境的体验现有的行为(BEHAVIOR_SHOW_BARS_BY_TOUCH, BEHAVIOR_SHOW_BARS_BY_SWIPE)已被弃用Android中12开始,他们已被替换缺省行为(BEHAVIOR_DEFAULT),允许比划着一个刷卡隐藏系统栏时。此标志根据模式显示不同的视觉和功能行为:
-
在三键模式下,视觉和功能行为与12之前的Android版本中的沉浸模式相同。
在手势导航模式下,行为如下:- 在视觉上,它与Android 11及更低版本中的沉浸模式相同。
- 在功能上,即使隐藏了栏,也允许使用手势。系统后部仅需要一次滑动即可调用,而无需使用Android 11的两次滑动。无需其他滑动即可拉下通知栏或开始回家。
-
BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE对于Android 12,粘性沉浸模式()并未更改
请注意此功能具有以下向后兼容性:
对于以Android 12和更低版本为目标的在Android 12上运行的应用:
- BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 在功能和视觉上都表现相同。
- 默认设置映射到BEHAVIOR_SHOW_BARS_BY_SWIPE。
-
对于在Android 11(API级别30)及更低版本(针对Android 12)上运行的应用:
- 除了BEHAVIOR_SHOW_BARS_BY_TOUCH 映射到之外,预期具有相同的行为BEHAVIOR_SHOW_BARS_BY_SWIPE
- 确保更新您的SDK级别以使用新的默认值(BEHAVIOR_SHOW_BARS_BY_SWIPE)。否则,BEHAVIOR_SHOW_BARS_BY_TOUCH 保留默认值。
前台服务通知延迟
为了为Android 12上的短期运行的前台服务提供简化的体验,系统可以将某些前台服务的前台服务通知显示延迟10秒。此更改使短期任务有机会在其通知出现之前完成。
如果前台服务至少具有以下特征之一,则系统在服务启动后立即显示关联的通知:
该服务与包含操作按钮的通知关联。
该服务拥有 foregroundServiceType 的connectedDevice,mediaPlayback,mediaProjection,或phoneCall。
-
该服务提供了在通知的category属性中定义的与电话,导航或媒体播放有关的用例。
注意:这些用例可能会在将来的Android 12 Developer Preview版本中进行更改。
该服务已通过setShowForegroundImmediately() 在设置通知时进行调用来退出行为更改 。
Netlink MAC地址限制
Android 12进一步限制了所有非系统应用程序对设备MAC地址(不可重置的标识符)的访问,无论目标API级别如何。
相关API会返回空值或占位符值,具体取决于应用程序的目标SDK版本:
- 如果您的应用针对Android 12,则API返回null。
- 如果您的应用定位到Android 11或更低版本,则API返回硬编码的占位符值: 02:00:00:00:00:00
开发人员应该使用ConnectivityManager ,而不是低级别的API,如NetworkInterface, getifaddrs()或网络链路插槽。当开发人员调用NetworkInterface.getHardwareAddress() 其代码时,logcat输出显示: CompatibilityChangeReporter: Compat change id reported: 170188668;
开发人员可以使用调用的兼容性标志RETURN_NULL_HARDWARE_ADDRESS 来切换NetworkInterface.getHardwareAddress() 启用或02:00:00:00:00:00禁用时返回null的行为。
不信任的触摸事件被阻止
为了保持系统安全性和良好的用户体验,Android 12会阻止应用程序在覆盖层以不安全的方式遮盖应用程序时使用触摸事件。换句话说,系统会阻止通过某些窗口的触摸,但有一些例外。
侵害的应用
此更改会影响选择让触摸通过其窗口(例如通过使用 FLAG_NOT_TOUCHABLE 标志)的应用。几个示例包括但不限于以下示例:
- 需要SYSTEM_ALERT_WINDOW 权限的叠加层 ,例如使用TYPE_APPLICATION_OVERLAY,使用FLAG_NOT_TOUCHABLE标志的窗口 。
- 使用该FLAG_NOT_TOUCHABLE标志的活动窗口。
- Toast messages.
例外情况
在以下情况下,允许“通过”触摸:
您的应用内的互动。您的应用会显示叠加层,并且叠加层仅在用户与您的应用进行交互时才会显示。
-
受信任的窗口。这些窗口包括(但不限于)以下内容:
- 辅助功能窗口
- 输入法编辑器(IME)窗口
- 助手窗口
注意:Windows类型 不受信任。TYPE_APPLICATION_OVERLAY
隐形窗户。窗口的根视图为 GONE或 INVISIBLE。
完全透明的窗口。该alpha窗口的 属性为0.0。
足够透明的系统警报窗口。当组合的不透明度小于或等于系统对触摸的最大遮盖不透明度时,系统认为一组系统警报窗口是足够透明的。在Developer Preview 1中,最大不透明度为0.8,但是此值稍后可能在Developer Preview中更改。
检测何时阻止了不受信任的触摸
如果触摸动作被系统阻止, Logcat会记录以下消息:
Untrusted touch due to occlusion by PACKAGE_NAME
测试变更
默认情况下,在运行Android 12 Developer Preview 1的设备上,不信任的触摸被阻止。要允许不信任的触摸,请在终端窗口中运行以下ADB命令:
# A specific app
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app
# All apps
# If you'd still like to see a Logcat message warning when a touch would be
# blocked, use 1 instead of 0.
adb shell settings put global block_untrusted_touches 0
要将行为恢复为默认行为(阻止了不信任的触摸),请运行以下命令:
# A specific app
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app
# All apps
adb shell settings put global block_untrusted_touches 2
应用无法关闭系统
为了在与应用程序和系统进行交互时改善用户控制,从 ACTION_CLOSE_SYSTEM_DIALOGS Android 12开始不推荐使用intent操作。除少数特殊情况外,当您的应用程序尝试调用包含此操作的intent时,系统会执行以下操作之一在您应用的目标SDK版本上:
- 如果您的应用程序以Android 12为目标,SecurityException则会出现a 。
- 如果您的应用定位到Android 11(API级别30)或更低版本,则该意图不会执行,并且Logcat中会显示以下消息 :
E ActivityTaskManager Permission Denial: \
android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \
com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \
dropping broadcast.
例外情况
在以下情况下,应用仍可以在Android 12上关闭系统对话框:
您的应用正在运行检测测试。
-
您的应用定位到Android 11或更低版本,并且在通知抽屉的顶部显示一个窗口。
注意:如果您的应用定位到Android 12,则ACTION_CLOSE_SYSTEM_DIALOGS在这种情况下无需使用 。这是因为,如果您的应用程序startActivity() 在通知抽屉顶部有一个窗口的同时调用 ,则系统会自动关闭通知抽屉。
您的应用定位到Android 11或更低版本。此外,用户可能已经使用通知的操作按钮与通知进行了交互,并且您的应用正在响应该用户操作来处理服务或广播接收器。
非SDK接口限制
Android 12包括基于与Android开发人员的协作以及最新的内部测试而更新的受限非SDK接口列表。只要有可能,在限制非SDK接口之前,请确保可以使用公共替代方案。
如果您的应用程序未针对Android 12,则其中的某些更改可能不会立即影响您。但是,尽管您目前可以使用某些非SDK接口(取决于应用程序的目标API级别),但是使用任何非SDK方法或字段始终会带来破坏应用程序的高风险。
如果不确定您的应用程序是否使用非SDK接口,则可以测试您的应用程序 以找出答案。如果您的应用程序依赖于非SDK接口,则应开始计划向SDK替代方案的迁移。不过,我们了解到某些应用程序具有使用非SDK接口的有效用例。如果您找不到在应用程序中使用非SDK接口替代功能的替代方法,则应请求一个新的Public API。
要了解有关此版本Android中的更改的更多信息,请参阅Android 12中非SDK接口限制的更新。要大致了解有关非SDK接口的更多信息,请参阅非SDK接口限制。