重要阅读:Android 12 更新内容(开发者必知) (重要阅读事迹或亲子阅读故事)(重要阅读事迹或亲子阅读故事)

访客 199 0

功能和API概述

Android 12为开发人员引入了许多令人兴奋的新功能和API。以下章节将帮助您全面了解应用程序的各项功能,并开始使用相关的API。

有关新的,已修改的和已删除的API的详细列表,请阅读 API差异报告。有关新API的详细信息,请访问Android API参考-突出显示新API以提高可见性。另外,要了解平台更改可能影响您的应用程序的区域,请务必查看针对Android 12的应用程序和所有应用程序的Android 12行为更改。

用于接收内容的统一API

Android 12引入了新的统一API,可让您从任何可用来源(剪贴板,键盘或拖放)接收丰富的内容。

如果您需要了解更多信息,请查阅用于接收内容的统一API。

兼容的媒体转码

Android 12具备自动转码功能,可以将设备上记录的HEVC(H.265)和HDR(HDR10和HDR10+)视频转换为AVC(H.264),这种格式与大多数标准播放器兼容。通过利用现代编解码器的优势,我们能够实现高度兼容性,而不会影响旧应用程序的使用。

如需了解更多详细信息,请查阅适用的媒体转码指南。

AVIF图像支持

Android 12现已支持AV1图像文件格式(AVIF),这是一种容器格式,用于存储使用AV1编码的图像和图像序列。与传统的JPEG等老旧图像格式相比,AVIF利用了视频压缩中的帧内编码技术,从而显著提高了相同文件大小下的图像质量。如果您想更深入地了解这种格式的优势,请查阅Jake Archibald所撰写的博客文章。

从音频产生触觉效果

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

如果您需要了解更多信息,请查阅HapticGenerator的参考文档。

对动画GIF和WebP的本机ImageDecoder支持

在Android 12中,NDK ImageDecoderAPI已经得到了扩展,现在它可以解码来自动画GIF和动画WebP文件格式的图像中的所有帧和定时数据。相比之前,在Android 11引入该API时,它只能解码这些格式动画的第一张图像。

选择使用ImageDecoder而不是依赖第三方库,可以进一步减小APK的体积,并从未来与安全性和性能相关的更新中获益。

如果您需要了解更多关于API的详细信息,请查阅API参考和GitHub上的示例。

设备属性验证可在非DPC应用中使用

Android 12引入了一项新功能,它可以扩展应用程序的一组功能。当这些应用程序生成新密钥时,它们能够验证证书中的设备属性。

自Android 9(API级别28)起,设备策略所有者(DPO)可以使用Keymaster 4.0或更高版本来验证证明证书中的设备属性。从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对沉浸式模式进行了简化,使手势导航更加轻松,并且与观看视频和阅读等活动的其他部分更加一致。应用程序仍然可以防止在全屏游戏体验中发生意外手势,因此用户在玩游戏时不会意外退出。现在,所有其他全屏或身临其境的体验都允许用户通过一键浏览手机。

为了实现这一目标,Android 12开始已经弃用了非粘性身临其境的体验行为(BEHAVIOR_SHOW_BARS_BY_TOUCH和BEHAVIOR_SHOW_BARS_BY_SWIPE)。它们被默认行为(BEHAVIOR_DEFAULT)所取代,允许用户通过划动手势来隐藏系统栏。根据模式的不同,此标志将展示不同的视觉和功能行为。

  • 在三键模式下,视觉和功能行为与Android 12之前的沉浸模式相同。而在手势导航模式下,行为如下:

    • 在视觉上,它与Android 11及更低版本中的沉浸模式相同。
    • 在功能上,即使隐藏了栏,也允许使用手势。系统后部仅需要一次滑动即可调用,而无需使用Android 11的两次滑动。无需其他滑动即可拉下通知栏或开始回家。
  • 在Android 12中,粘性沉浸模式下的BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE并没有发生任何改变。

    请注意,此功能具有以下向后兼容性:
    对于在 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秒。这个改变给了短期任务在通知出现之前完成的机会。

只要前台服务具备以下特征之一,系统将在服务启动后立即显示相关通知:

  • 与通知相关联的是包含操作按钮的该服务。

  • 该服务支持 connectedDevice、mediaPlayback、mediaProjection 或 phoneCall 的 foregroundServiceType。

  • 我们的服务为您提供了与电话、导航或媒体播放相关的用例,这些用例在通知的category属性中得到了定义。

    注意:这些用例可能会在将来的Android 12 Developer Preview版本中进行更改。
  • 为了更改退出行为,该服务已经在设置通知时调用了setShowForegroundImmediately()方法。

Netlink MAC地址限制

Android 12对设备MAC地址(不可重置的标识符)的访问进一步限制,无论目标API级别如何,所有非系统应用程序都受到了影响。

根据应用程序的目标SDK版本,相关API可能会返回空值或占位符值。

  • 如果您的应用针对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。

为了切换NetworkInterface.getHardwareAddress()方法的行为,开发人员可以使用兼容性标志RETURN_NULL_HARDWARE_ADDRESS。当该标志被启用时,该方法将返回null而不是默认的02:00:00:00:00:00值。

不信任的触摸事件被阻止

为了确保系统的安全性和用户体验,Android 12将禁止应用程序以不安全的方式使用覆盖层来遮盖其他应用程序时触发触摸事件。换句话说,系统将限制某些窗口上的触摸操作,但也会有一些特殊情况例外。

侵害的应用

以下更改将会影响那些选择通过其窗口进行触摸操作的应用(例如,使用 FLAG_NOT_TOUCHABLE 标志)。下面是一些示例,但不限于:

  • 需要SYSTEM_ALERT_WINDOW 权限的叠加层 ,例如使用TYPE_APPLICATION_OVERLAY,使用FLAG_NOT_TOUCHABLE标志的窗口 。
  • 使用该FLAG_NOT_TOUCHABLE标志的活动窗口。
  • Toast messages.

例外情况

在以下情况下,允许通过触摸方式进行操作:

  • 您的应用内互动。当用户与您的应用进行交互时,叠加层将显示在应用界面上,并且仅在此时才会出现。

  • 可靠的窗口。这些窗口涵盖(但不仅限于)以下内容:

    • 辅助功能窗口
    • 输入法编辑器(IME)窗口
    • 助手窗口
      注意:Windows类型 不受信任。TYPE_APPLICATION_OVERLAY
  • 隐藏窗户。窗口的根视图被设置为不可见或隐藏状态。

  • 这是一个完全透明的窗口,其alpha属性为0.0。

  • 系统警报窗口应具备足够的透明度。当多个窗口组合的不透明度小于或等于系统对触摸操作的最大遮盖不透明度时,系统会认为这组警报窗口具备足够的透明性。在Developer Preview 1版本中,最大不透明度设定为0.8,但该数值可能会在后续Developer Preview版本中进行调整。

检测何时阻止了不受信任的触摸

当系统阻止触摸动作时,Logcat将会记录以下信息:

Touch interaction is not trusted due to occlusion caused by PACKAGE_NAME.

测试变更

在运行Android 12 Developer Preview 1的设备上,默认情况下会阻止不信任的触摸。如果要允许不信任的触摸,请在终端窗口中执行以下ADB命令:

# A specific appadb 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

要将行为恢复为默认行为(阻止了不信任的触摸),请运行以下命令:

为了提升用户控制和应用程序与系统的交互体验,Android 12开始不推荐使用intent操作来关闭系统。除非特殊情况,当您的应用程序尝试调用包含ACTION_CLOSE_SYSTEM_DIALOGS操作的intent时,系统会根据您应用的目标SDK版本执行以下操作之一: 
  • 如果您的应用程序以Android 12为目标,SecurityException则会出现a 。
  • 如果您的应用定位到Android 11(API级别30)或更低版本,则该意图不会执行,并且Logcat中会显示以下消息 :
在Android 12上,应用程序仍然可以关闭系统对话框,除非出现以下情况: 
  • 正在进行应用运行检测测试。

  • 您的应用适用于Android 11或更早版本,并且会在通知抽屉顶部展示一个窗口。

    注意:如果您的应用定位到Android 12,则ACTION_CLOSE_SYSTEM_DIALOGS在这种情况下无需使用 。这是因为,如果您的应用程序startActivity() 在通知抽屉顶部有一个窗口的同时调用 ,则系统会自动关闭通知抽屉。
  • 您的应用定位到Android 11或更低版本。此外,用户可能已经使用通知的操作按钮与通知进行了交互,并且您的应用正在响应该用户操作来处理服务或广播接收器。

非SDK接口限制

Android 12经过与Android开发人员的合作以及最新的内部测试,更新了受限非SDK接口列表。在使用这些受限非SDK接口之前,请确保尽可能地使用公共替代方案。

如果您的应用程序尚未适配Android 12,那么其中的一些变化可能不会立即对您产生影响。然而,请注意,尽管根据应用程序的目标API级别,您目前可能可以使用某些非SDK接口,但是使用任何非SDK方法或字段始终会带来破坏应用程序的高风险。

如果不确定您的应用程序是否使用非SDK接口,则可以测试您的应用程序 以找出答案。如果您的应用程序依赖于非SDK接口,则应开始计划向SDK替代方案的迁移。不过,我们了解到某些应用程序具有使用非SDK接口的有效用例。如果您找不到在应用程序中使用非SDK接口替代功能的替代方法,则应请求一个新的Public API。

如果您想了解有关此版本Android的更改的详细信息,请查看关于Android 12中非SDK接口限制的更新。若您希望对非SDK接口有一个大致的了解,请参阅非SDK接口限制文档。

标签: 版本 窗口 系统

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~