Android - Android12新特性

文章目录[x]
  1. 1:用于接收内容的统一 API
  2. 1.1:概述
  3. 1.2:使用
  4. 2:兼容的媒体转码
  5. 2.1:在资源中声明功能
  6. 2.2:在代码中声明功能
  7. 2.3:AVIF 图片支持
  8. 2.4:动画 GIF 和 WebP 的原生 ImageDecoder 支持
  9. 3:在非 DPC 应用中提供设备属性验证
  10. 4:行为变更
  11. 4.1:前台服务通知延迟
  12. 4.2:前台服务启动限制
  13. 4.3:包含 intent 过滤器的应用组件必须声明导出的属性
  14. 4.4:非SDK限制

最近,Android团队发布了Anroid 12开发者预览版  ,Android 12 开发者预览版计划从 20212 月开始启动,到向 AOSPOEM 提供最终的公开版本时结束,最终版本预计将在今年年底发布。2021年Google IO大会将在2021年5月18日至20日在线举办

用于接收内容的统一 API

概述

Android 12 引入了全新的统一 API,可以从任何可用来源(剪贴板、键盘或拖放操作)接收富媒体内容。用户喜欢图片、视频和其他富有表现力的内容,但在应用中插入和移动这些内容并非易事。为了使应用能够轻松接收富媒体内容,引入了全新的统一 API,便于接受来自任何来源(剪贴板粘贴、键盘输入或拖放操作)的内容。 您可以向界面组件附加新接口 OnReceiveContentListener,并在通过任何机制插入内容时获得回调。此回调会成为代码处理接收所有内容(从纯文本和样式文本到标记、图片、视频、音频文件等)的唯一位置。

使用现有 API 时,每个界面机制(例如长按菜单或拖放)都有对应的 API。这意味着您必须单独与每个 API 集成,并为每种插入内容的机制添加类似的代码:

以前,应用需要为每个界面机制实现不同的 API 来插入内容

统一 API 会通过创建一个要实现的单一 API 来整合这些不同的代码路径,这样就可以专注于应用特定的逻辑,而让平台处理其余的工作:

使用

要使用需要Kotlin版本的androidx core包:

implementation 'androidx.core:core-ktx:1.6.0-alpha03'

API 是一个监听器接口,包含一种方法,即 OnReceiveContentListener。为了支持较低版本的 Android 平台,可以使用 AndroidX Core 库中的匹配 OnReceiveContentListener 接口。 如需使用该 API,请先指定应用可以处理哪些类型的内容,以开始实现该监听器:

class ContentReceiver: OnReceiveContentListener {
companion object{
@JvmField val MIME_TYPES = arrayOf("image/*", "video/*")
}

}

指定应用支持的所有内容 MIME 类型后,实现该监听器的其余部分:

* @author Melrose
* @since 1.0.0
*/
class ContentReceiver: OnReceiveContentListener {
companion object{
@JvmField val MIME_TYPES = arrayOf("image/*", "video/*")
}

override fun onReceiveContent(view: View, payload: ContentInfoCompat): ContentInfoCompat? {
val split = payload.partition{ it.uri!=null }

val uriContent = split.first
val remaining = split.second

uriContent?.let {
val clip = uriContent.clip
for (position in 0..clip.itemCount-1){
val uri = clip.getItemAt(position).getUri()
//处理特定URI

}
}
//返回应用未处理的内容。 这将保留默认的文本和其他未实现自定义处理功能的平台行为。
return remaining
}

}
 如果应用已经支持与 intent 共享,可以重复使用应用特定逻辑来处理内容 URI。将任何剩余数据返回以委派给平台进行处理。
实现监听器后,可以设置该监听器:
ViewCompat.setOnReceiveContentListener(
 findViewById(R.id.appCompatEditText),
 ContentReceiver.MIME_TYPES,
 ContentReceiver()
 )

兼容的媒体转码

Android 12 引入了一项新功能,让视频捕捉应用可以对设备上录制的视频进行更现代、存储效率更高的编码,同时又不影响与其他应用的兼容性。

Android 12 可以自动将设备上录制的 HEVC(H.265)HDR(HDR10HDR10+)视频转码为 AVC (H.264)AVC (H.264) 是与标准播放器广泛兼容的格式。因此,当现代编解码器可用且不会影响与旧应用的兼容性时,便会利用现代编解码器。

如果视频被不支持 HEVC 格式的应用打开,Android 会自动将以 HEVC (H.265) 等格式录制的视频转码为 AVC (H.264) 格式。

对于在设备上创建的以下格式的内容,系统可以自动进行转码:

媒体格式 XML 属性 MediaFormat MIME 类型
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10 HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android 假定应用可以支持播放所有媒体格式,因此兼容的媒体转码在默认情况下是关闭的。如果应用请求将媒体转码为更兼容的格式,则应声明其媒体功能。有两种声明这些功能的方法:在资源中声明,或在代码中内嵌声明。

在资源中声明功能

首先,创建 media_capabilities.xml 资源文件:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
<format android:name="HEVC" supported="true"/>
<format android:name="HDR10" supported="false"/>
<format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

在此示例中,设备上录制的 HDR 视频被无缝转码为 AVC SDR(标准动态范围)视频,而 HEVC 视频则无法转码。

application 标记中使用 property 标记来添加对媒体功能文件的引用。将以下属性添加到 AndroidManifest.xml 文件中:

<property
android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
android:resource="@xml/media_capabilities" />

在代码中声明功能

您可以使用构建器构造 ApplicationMediaCapabilities 对象的实例,在代码中声明媒体功能:

val mediaCapabilities = ApplicationMediaCapabilities.Builder()
.addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
.addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
.addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
.build()

通过 ContentResolver#openTypedAssetFileDescriptor() 等方法访问媒体内容时,请使用此对象:

val providerOptions = Bundle().apply {
 putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities)
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
 .use { fileDescriptor ->
 //内容将根据提供的ApplicationMediaCapabilities中定义的值进行转码。
 }

AVIF 图片支持

Android 12 引入了对使用 AV1 图片文件格式 (AVIF) 的图片的支持。AVIF 是一种使用 AV1 编码的图片和图片序列的容器格式。它利用了视频压缩的帧内编码内容。与以前的图片格式(例如 JPEG)相比,这种格式可显著提升相同文件大小下的图片质量。

动画 GIF 和 WebP 的原生 ImageDecoder 支持

Android 12 中,NDK ImageDecoder API 已进行了扩展,可以对使用以下文件格式的图片的所有帧和时间数据进行解码:动画 GIF 和动画 WebP 文件格式。在 Android 11 中引入该 API 时,该 API 仅从这些格式的动画中解码第一张图片。

使用 ImageDecoder(而非第三方库)可进一步缩减 APK 大小,并从未来与安全性和性能相关的更新中受益。

在非 DPC 应用中提供设备属性验证

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

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

  • BRAND
  • DEVICE
  • MANUFACTURER
  • MODEL
  • PRODUCT

行为变更

前台服务通知延迟

为了在 Android 12 上提供针对短时间运行的前台服务的流畅体验,系统可以为某些前台服务延迟 10 秒显示前台服务通知。此更改使某些短期任务在显示通知之前完成。

如果某项前台服务至少具有以下特征之一,则系统会在服务启动后立即显示相关通知:

  • 该服务与包含操作按钮的通知相关联。
  • 该服务的 foregroundServiceTypeconnectedDevicemediaPlaybackmediaProjectionphoneCall
  • 该服务根据通知的类别属性中的定义,提供与通话、导航或媒体播放相关的用例。
  • 该服务通过在设置通知时调用 setShowForegroundImmediately(),以停用行为变更。

前台服务启动限制

除少数例外情况,应用再也无法在后台运行时启动前台服务。否则,系统会抛出异常。

包含 intent 过滤器的应用组件必须声明导出的属性

包含 intent 过滤器的应用组件必须显式设置 android:exported 属性。 未设置该属性的应用无法安装在 Android 12 上。

非SDK限制

Android 12 包含更新后的受限制非 SDK 接口列表。在限制使用非 SDK 接口之前,会尽可能确保有可用的公开替代方案。

如果应用并非以 Android 12 为目标平台,其中一些变更可能不会立即产生影响。然而,虽然目前仍可以使用一些非 SDK 接口(具体取决于应用的目标 API 级别),但只要使用任何非 SDK 方法或字段,终归存在导致应用出问题的显著风险。

如果不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用来进行确认。如果的应用依赖于非 SDK 接口,应该开始计划迁移到 SDK 替代方案。然而,知道某些应用具有使用非 SDK 接口的有效用例。如果无法为应用中的某项功能找到使用非 SDK 接口的替代方案,应请求新的公共 API

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00