多摄像头支持和摄像头更新
在运行 Android 9 的设备上,您可以通过两个或更多物理摄像头来同时访问多个视频流。] 在配备双前置摄像头或双后置摄像头的设备上,您可以创建只配备单摄像头的设备所不可能实现的创新功能,例如无缝缩放、背景虚化和立体成像。 通过该 API,您还可以调用逻辑或融合的摄像头视频流,该视频流可在两个或更多摄像头之间自动切换。
摄像头方面的其他改进还包括附加会话参数和 Surface 共享,前者有助于降低首次拍照期间的延迟,而后者则让摄像头客户端能够处理各种用例,而无需停止并启动摄像头视频流。 我们还针对基于显示屏的 flash 支持和 OIS 时间戳访问新增了一些 API,用以实现应用级的图像稳定化和特效。
在 Android 9 中,多摄像头 API支持单色摄像头,适用于具有 FULL
或 LIMITED
功能的设备。 单色输出通过 YUV_420_888
格式实现,Y 为灰度,U (Cb) 为 128,V (Cr) 为 128。
在受支持的设备上,Android 9 还支持外置 USB/UVC 摄像头。
适用于可绘制对象和位图的 ImageDecoder
Android 9 引入了 ImageDecoder
类,可提供现代化的图像解码方法。 使用该类取代 BitmapFactory
和 BitmapFactory.Options
API。
ImageDecoder
让您可通过字节缓冲区、文件或 URI 来创建 Drawable
或 Bitmap
。 要解码图像,请首先以编码图像的来源为参数,调用 createSource()
。 然后,通过传递 ImageDecoder.Source
对象来调用 decodeDrawable()
或 decodeBitmap()
,从而创建 Drawable
] 或 Bitmap
。 要更改默认设置,请将 OnHeaderDecodedListener
传递给 decodeDrawable()
或 decodeBitmap()
。 ImageDecoder
调用 onHeaderDecoded()
,以图像的默认宽度和高度(若已知)为参数。 如果编码图像是动画 GIF 或 WebP,decodeDrawable()
将返回 Drawable
,它是 AnimatedImageDrawable
类的一个实例。
您可以使用不同的方法来设置图像属性:
- 要将解码的图像缩放到精确尺寸,请将目标尺寸传递给
setTargetSize()
。 您也可以使用样图尺寸来缩放图像。 将样图尺寸直接传递给setTargetSampleSize()
。 - 要在缩放图像的范围内裁剪图像,请调用
setCrop()
。 - 要创建可变位图,请将
true
传递给setMutableRequired()
。
通过 ImageDecoder
还可以为圆角或圆形遮罩之类的图像添加复杂的定制效果。 以 PostProcessor
类的一个实例作为参数使用 setPostProcessor()
,执行您所需的任何绘图命令。
注:对 AnimatedImageDrawable
进行后处理时,效果会出现在动画的所有帧中。
动画
Android 9 引入了 AnimatedImageDrawable
类,用于绘制和显示 GIF 和 WebP 动画图像。 AnimatedImageDrawable
的工作方式与 AnimatedVectorDrawable
的相似之处在于,都是渲染线程驱动 AnimatedImageDrawable
的动画。 渲染线程还使用工作线程进行解码,因此,解码不会干扰渲染线程的其他操作。 这种实现机制允许您的应用在显示动画图像时,无需管理其更新,也不会干扰应用界面线程上的其他事件。
可使用 ImageDecoder
的实例对 AnimatedImageDrawable
进行解码。 以下代码段演示如何使用 ImageDecoder
来解码 AnimatedImageDrawable
:
-
private void decodeImage() throws IOException {
-
Drawable decodedAnimation = ImageDecoder.decodeDrawable(
-
ImageDecoder.createSource(getResources(), R.drawable.my_drawable));
-
if (decodedAnimation instanceof AnimatedImageDrawable) {
-
// Prior to start(), the first frame is displayed.
-
((AnimatedImageDrawable) decodedAnimation).start();
-
}
-
}
ImageDecoder
有几个允许您进一步修改图像的函数。 例如,可使用 setPostProcessor()
函数来修改图像的外观,如应用圆形遮罩或圆角。
HDR VP9 视频、HEIF 图像压缩和 Media API
Android 9 新增了对 High Dynamic Range (HDR) VP9 Profile 2 的内置支持,因此,现在您可以在支持 HDR 的设备上为用户提供来自 YouTube、Play Movies 和其他来源的采用 HDR 的影片。
Android 9 为平台增加了对 HEIF (heic) 图像编码的支持。 MediaMuxer
和 MediaExtractor
类中可支持 HEIF 静态图像示例 HEIF 改进了压缩,可节省存储空间和网络数据流量。 借助 Android 9 设备上的平台支持,从后端服务器发送和使用 HEIF 图像轻而易举。 确保应用兼容这种便于共享和显示的数据格式后,尝试在应用中使用 HEIF 作为图像存储格式。 您可以使用 ImageDecoder 或 BitmapFactory 进行 jpeg 到 heicto 的转换,以通过 jpeg 获取位图,并且可以使用 HeifWriter 写入来自 YUV 字节缓冲区、Surface 或 Bitmap 的 HEIF 静态图像。
还可通过 AudioTrack
、AudioRecord
和 MediaDrm
类获取媒体指标。
Android 9 向 MediaDRM
类添加了函数以获取指标、高带宽数字内容保护 (HDCP) 级别、安全级别和会话数,并对安全性级别和安全停止进行更多控制。 如需了解更多详情,请参阅 API 差异报告。
在 Android 9 中,AAudio API 包含 AAudioStream 属性,用于 usage、content type 和 input preset。 使用这些属性可以创建针对 VoIP 或摄像机应用调整的流。 您还可以设置 SessionID将 AAudio 流与可包含音效的子混音相关联。 使用 AudioEffect API
来控制音效。
Android 9 包含一个用于 DynamicsProcessing 的 AudioEffect API。 借助该类,可以构建基于通道的音效,由各种类型(包括均衡、多频带压缩和限幅器)的多个阶段组成。 频带和活动阶段的数量可配置,而且大多数参数可实时控制。
JobScheduler 中的流量费用敏感度
从 Android 9 开始,JobScheduler
可以使用运营商提供的网络状态信号来改善与网络有关的作业处理。
作业可以声明其预估的数据大小、信号预提取,并指定具体的网络要求。 JobScheduler
然后根据网络状态管理工作。 例如,当网络显示拥塞时,JobScheduler
可能会延迟较大的网络请求。 如果使用的是不按流量计费的网络,则 JobScheduler
可运行预提取作业以提升用户体验(例如预提取标题)。
添加作业时,确保使用 setEstimatedNetworkBytes()
、setPrefetch()
和 setRequiredNetwork()
(如果适用),以帮助 JobScheduler
正确处理工作。 在执行作业时,请确保使用 JobParameters.getNetwork()
返回的 Network
对象。 否则,您将隐式使用设备的默认网络,其可能不符合您的要求,从而导致意外的流量消耗。
Neural Networks API 1.1
Android 8.1(API 级别 27)中引入了 Neural Networks API 以加快 Android 设备上机器学习的速度。 Android 9 扩展和改进了该 API,增加了对九种新运算的支持:
- 元素级数学运算:
- 数组运算:
已知问题: 将 ANEURALNETWORKS_TENSOR_QUANT8_ASYMM
张量传递到 ANEURALNETWORKS_PAD
运算(在 Android 9 及更高版本中提供)时,NNAPI 的输出可能与较高级别机器学习框架(如 TensorFlow Lite)的输出不匹配。 应只传递ANEURALNETWORKS_TENSOR_FLOAT32
直到问题得到解决。
此外,API 还引入了一个新函数,即 ANeuralNetworksModel_relaxComputationFloat32toFloat16()
,允许您指定是否计算范围和精度低至 IEEE 754 16 位浮点格式的 ANEURALNETWORKS_TENSOR_FLOAT32
。
自动填充框架
Android 9 引入了多项改进,自动填充服务可以利用这些改进进一步增强用户填写表单时的体验。 如需详细了解如何在您的应用中使用自动填充功能,请参阅自动填充框架指南。
安全增强功能
Android 9 引入了若干安全功能,详见以下各节摘要说明:
Android Protected Confirmation
运行 Android 9 或更高版本的受支持设备赋予您使用 Android Protected Confirmation 的能力。 使用该工作流时,您的应用会向用户显示提示,请他们批准一个简短的声明。 应用可以通过这个声明再次确认,用户确实想完成一项敏感事务,例如付款。
如果用户接受该声明,Android 密钥库会收到并存储由密钥哈希消息身份验证代码 (HMAC) 保护的加密签名。 Android 密钥库确认消息的有效性之后,您的应用可以使用在可信执行环境 (TEE) 下通过 trustedConfirmationRequired
生成的密钥来签署用户已接受的消息。 该签名具有很高的可信度,它表示用户已看过声明并同意其内容。
注意:Android Protected Confirmation 不会为用户提供安全信息通道。 应用无法承担 Android 平台所提供机密性保证之外的任何其他保证。 尤其是,请勿使用该工作流显示您通常不会显示在用户设备上的敏感信息。
如需获得 Android Protected Confirmation 新增支持方面的指导,请参阅 Android Protected Confirmation 指南。
统一生物识别身份验证对话框
在 Android 9 中,系统代表您的应用提供生物识别身份验证对话框。 该功能可创建标准化的对话框外观、风格和位置,让用户更加确信,他们在使用可信的生物识别凭据检查程序进行身份验证。
如果您的应用使用 FingerprintManager
向用户显示指纹身份验证对话框,请切换到改用 BiometricPrompt
。BiometricPrompt
依赖系统来显示身份验证对话框。 它还会改变其行为,以适应用户所选择的生物识别身份验证类型。
注:在应用中使用 BiometricPrompt
之前,应该先使用 hasSystemFeature()
函数以确保设备支持 FEATURE_FINGERPRINT
、FEATURE_IRIS
或 FEATURE_FACE
。
如果设备不支持生物识别身份验证,可以回退为使用 createConfirmDeviceCredentialIntent()
函数验证用户的 PIN 码、图案或密码。
硬件安全性模块
运行 Android 9 或更高版本的受支持设备可拥有 StrongBox Keymaster,它是位于硬件安全性模块中的 Keymaster HAL 的一种实现。 该模块包含以下组成部分:
- 自己的 CPU。
- 安全存储空间。
- 真实随机数生成器。
- 可抵御软件包篡改和未经授权线刷应用的附加机制。
检查存储在 StrongBox Keymaster 中的密钥时,系统会通过可信执行环境 (TEE) 证实密钥的完整性。
如需了解有关使用 Strongbox Keymaster 的更多信息,请参阅硬件安全性模块。
保护对密钥库进行的密钥导入
Android 9 通过利用 ASN.1‑编码密钥格式将已加密密钥安全导入密钥库的功能,提高了密钥解密的安全性。 Keymaster 随后会在密钥库中将密钥解密,因此密钥的内容永远不会以明文形式出现在设备的主机内存中。
注:只有附带 Keymaster 4 或更高版本的设备才支持该功能。
详细了解如何更安全地导入已加密密钥。
具有密钥轮转的 APK 签名方案
Android 9 新增了对 APK Signature Scheme v3 的支持。该架构提供的选择可以在其签名块中为每个签名证书加入一条轮转证据记录。 利用此功能,应用可以通过将 APK 文件过去的签名证书链接到现在签署应用时使用的证书,从而使用新签名证书来签署应用。
注:运行 Android 8.1(API 级别 27)或更低版本的设备不支持更改签名证书。 如果应用的 minSdkVersion
为 27
或更低,除了新签名之外,可使用旧签名证书来签署应用。
详细了解如何使用 apksigner
轮转密钥。
只允许在未锁定设备上进行密钥解密的选项
Android 9 引入了 unlockedDeviceRequired
标志。 此选项确定在允许使用指定密钥对任何正在传输或存储的数据进行解密之前,密钥库是否要求屏幕解锁。 这些类型的密钥非常适合用于加密要存储在磁盘上的敏感数据,例如健康或企业数据。 该标志为用户提供了更高的保证,即使手机丢失或被盗,在设备锁定的情况下,无法对数据进行解密。
注:unlockedDeviceRequired
标志启用之后,仍然可以随时进行加密和签名验证。 该标志可防止在设备解锁时“仅解密”数据。
在设备锁定时要确保密钥安全不被解密,可通过将 true
传递给 setUnlockedDeviceRequired()
函数启用该标志。 完成该步骤之后,当用户的屏幕被锁定时,使用该密钥进行解密或签署数据的任何尝试都会失败。 锁定设备在可以访问之前,需要 PIN 码、密码、指纹或者一些其他可信因素。
旧版加密支持
附带 Keymaster 4 的 Android 9 设备支持三重数据加密算法(简称三重 DES)。 如果您的应用与需要三重 DES 的旧版系统进行互操作,请使用这种加密来加密敏感凭据。
如需详细了解如何让您的应用更加安全,请参阅 Android 开发者的安全性。