本页详细介绍了相机 HAL、API 和相关的兼容性测试套件 (CTS) 测试中的版本差异,还介绍了在 Android 7.0 中为增强和提高相机框架安全性而进行的几项架构更改,在 Android 8.0 中引入的 Treble,以及供应商在其相机实现中为支持这些更改而必须进行的更新。
术语
本页中用到以下术语:
- 相机 API1
- Android 4.4 及更低版本设备上的应用级相机框架,通过
android.hardware.Camera
类公开。 - 相机 API2
- Android 5.0 及更高版本设备上的应用级相机框架,通过
android.hardware.camera2
软件包公开。 - 相机 HAL
- 由 SoC 供应商实现的相机模块层。应用级公共框架基于相机 HAL 构建而成。
- 相机 HAL3.1
- 随 Android 4.4 发布的相机设备 HAL 版本。
- 相机 HAL3.2
- 随 Android 5.0 发布的相机设备 HAL 版本。
- 相机 API1 CTS
- 在相机 API1 之上运行的相机 CTS 测试集。
- 相机 API2 CTS
- 在相机 API2 之上运行的另一个相机 CTS 测试集。
- Treble
- 利用新的供应商接口,将供应商实现(由芯片制造商编写的更接近底层的设备特定软件)与 Android 操作系统框架分离开来。
- HIDL
- HAL 接口定义语言随 Treble 引入,用于指定 HAL 和其用户之间的接口。
- VTS
- 供应商测试套件随 Treble 引入。
相机 API
Android 包含以下相机 API。
相机 API1
Android 5.0 已弃用 Camera API1,而且随着新平台开发的重点放在 Camera API2 上,Camera API1 会逐渐被淘汰。但是,淘汰期限将会很长,而且在一段时间内新 Android 版本会继续支持 Camera API1 应用。具体来说,将继续为以下内容提供支持:
- 供应用使用的相机 API1 接口。在相机 API1 之上构建的相机应用应该像在搭载较低 Android 版本的设备上一样工作。
- 相机 HAL 版本。包括对 Camera HAL1.0 的支持。
相机 API2
Camera API2 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。如需了解详情,请观看 Google I/O 视频概览。
Android 5.0 及更高版本提供相机 API2;但是,搭载 Android 5.0 及更高版本的设备可能并不支持所有相机 API2 功能。应用可通过相机 Camera API2 接口查询 android.info.supportedHardwareLevel
属性。该属性会报告以下支持级别之一:
LEGACY
:这些设备通过相机 API2 接口向应用公开功能,但这些功能与通过相机 API1 接口向应用公开的功能大致相同。旧版框架代码在概念上将相机 API2 调用转换为相机 API1 调用;旧版设备不支持相机 API2 功能,例如每帧控件。LIMITED
:这些设备支持部分(而非全部)相机 API2 功能,并且必须使用相机 HAL 3.2 或更高版本。FULL
:这些设备支持相机 API2 的所有主要功能,并且必须使用相机 HAL 3.2 或更高版本以及 Android 5.0 或更高版本。LEVEL_3
:这些设备支持 YUV 重新处理和 RAW 图片拍摄,以及其他输出流配置。EXTERNAL
:这些设备类似于LIMITED
设备,但有一些例外情况;例如,某些传感器或镜头信息可能未得到报告或具有较不稳定的帧速率。此级别用于外部相机(如 USB 网络摄像头)。
各项功能通过相机 API2 接口中的 android.request.availableCapabilities
属性公开。FULL
设备需要具备 MANUAL_SENSOR
和 MANUAL_POST_PROCESSING
等功能。但即使是 FULL
设备,也并非必须实现 RAW
功能。LIMITED
设备可以提供这些功能的任何子集,甚至不提供其中任何功能。但是,必须始终定义 BACKWARD_COMPATIBLE
功能。
设备支持的硬件层级及其支持的特定相机 API2 功能采用以下功能标志的形式指明,以允许 Google Play 过滤相机 API2 相机应用。
android.hardware.camera.hardware_level.full
android.hardware.camera.capability.raw
android.hardware.camera.capability.manual_sensor
android.hardware.camera.capability.manual_post_processing
CTS 要求
搭载 Android 5.0 及更高版本的设备必须通过相机 API1 CTS、相机 API2 CTS 和 CTS 验证程序相机测试。
不具备相机 HAL3.2 实现且无法支持完整的相机 API2 接口的设备仍必须通过相机 API2 CTS 测试。但是,该设备在相机 API2 LEGACY
模式下运行(在该模式下,相机 API2 调用在概念上映射到相机 API1 调用),因此相机 API1 未涵盖的特性或功能对应的任何相机 API2 CTS 测试都将自动跳过。
在旧版设备上,运行的相机 API2 CTS 测试使用现有的公共相机 API1 接口和功能,没有新的要求。发现的 bug(会导致相机 API2 CTS 失败)是设备现有相机 HAL 中已经存在的 bug,因此可由现有相机 API1 应用找到。我们预计不会有很多这种性质的 bug(但是,必须修复任何此类 bug 才能通过相机 API2 CTS 测试)。
VTS 要求
采用绑定式 HAL 实现的运行 Android 8.0 及更高版本的设备必须通过相机 VTS 测试。
相机框架强化
为了增强媒体和相机框架的安全性,Android 7.0 已将相机服务从 mediaserver 中移出。从 Android 8.0 开始,每个绑定式相机 HAL 都会在与相机服务不同的进程中运行。供应商可能需要根据正在使用的 API 和 HAL 版本对相机 HAL 进行更改。以下部分详细介绍了在 HAL1 和 HAL3 的 AP1 和 AP2 中进行的架构更改,以及常规要求。
API1 的架构更改
API1 视频录制可能会假定相机和视频编码器存在于同一进程中。在以下对象上使用 API1 时:
- HAL3,其中相机服务使用 BufferQueue 在进程之间传递缓冲区,不需要供应商更新。
- HAL1(支持在视频缓冲区中传递元数据),供应商必须更新 HAL 才能使用
kMetadataBufferTypeNativeHandleSource
。(Android 7.0 不再支持kMetadataBufferTypeCameraSource
。)
API2 的架构更改
对于 HAL1 或 HAL3 上的 API2,BufferQueue 会传递缓冲区,以便这些路径能继续工作。Android 7.0 的 API2 架构:
- 若在 HAL1 上,则不受 cameraservice 移动的影响,并且不需要供应商更新。
- 若在 HAL3 上,则会受到影响,但不需要供应商更新。
其他要求
为增强媒体和相机框架安全性而进行的架构更改包括以下附加设备要求。
- 常规:由于 IPC,设备需要额外带宽,这可能会影响对时间敏感的相机用例,例如高速视频录制。供应商可以运行
android.hardware.camera2.cts.PerformanceTest
和 Google 相机应用,以进行 120/240 FPS 高速视频录制,以此来衡量实际影响。设备还需要少量额外的 RAM 来创建新进程。 - 在视频缓冲区中传递元数据(仅限 HAL1)。如果 HAL1 在视频缓冲区中存储元数据而非实际的 YUV 帧数据,那么,HAL 必须使用
kMetadataBufferTypeNativeHandleSource
作为元数据缓冲区类型,并在视频缓冲区中传递VideoNativeHandleMetadata
。(Android 7.0 不再支持kMetadataBufferTypeCameraSource
。)通过VideoNativeHandleMetadata
,相机和媒体框架能够正确地对原生句柄进行序列化和反序列化,从而在进程之间传递视频缓冲区。 - 缓冲区句柄地址并不总是存储相同的缓冲区(仅限 HAL3)。对于每个捕获请求,HAL3 会获取缓冲区句柄的地址。HAL 不能使用地址来识别缓冲区,因为相应地址可能会在 HAL 返回缓冲区之后用于存储另一个缓冲区句柄。您必须更新 HAL 才能使用缓冲区句柄来标识缓冲区。例如:HAL 接收到缓冲区句柄地址 A,该地址中存储了缓冲区句柄 A。在 HAL 返回缓冲区句柄 A 之后,下次又接收到缓冲区句柄地址时,该地址中存储的可能是缓冲区句柄 B。
- 更新用于 cameraserver 的 SELinux 政策。如果设备特定的 SELinux 政策向 mediaserver 授予运行相机的权限,您必须更新 SELinux 政策,以授予 cameraserver 正确的权限。我们建议不要为 cameraserver 复制 mediaserver 的 SELinux 策略(因为 mediaserver 和 cameraserver 通常需要系统中的不同资源)。Cameraserver 应仅具有执行相机功能所需的权限,并且 mediaserver 中任何不必要的相机相关权限均应被移除。
- 将相机 HAL 与 cameraserver 分离开。此外,搭载 Android 8.0 或更高版本的设备会在与 cameraserver 不同的进程中分离绑定式相机 HAL。IPC 会通过 HIDL 定义的接口进行。
验证
对于所有包含相机并搭载 Android 7.0 的设备,请通过运行 Android 7.0 CTS 来验证实现。尽管 Android 7.0 不包含验证相机服务更改的新 CTS 测试,但如果您尚未进行上述更新,则现有的 CTS 测试将会失败。
对于包含相机并搭载 Android 8.0 或更高版本的所有设备,请通过运行 VTS 来验证供应商实现。
相机 HAL 版本历史记录
有关可用于评估 Android 相机 HAL 的测试列表,请参阅相机 HAL 测试核对清单。
Android 10
Android 10 引入了以下更新。
Camera API
- 多相机方面的改进;既可单独使用各个物理相机,也可通过隐藏物理相机 ID 并借助相应的逻辑相机来使用物理相机。请参阅多相机支持。
- 能够检查是否支持特定的会话配置,而不会因创建新会话而产生性能开销。请参阅
CameraDevice
。 - 能够检索指定用例的推荐数据流配置,从而使客户端更加节能和高效。请参阅
getRecommendedStreamConfigurationMap
。 - 支持深度 JPEG 图片格式。如需更多详细信息,请参阅动态深度规范。
- 支持 HEIC 图片格式。请参阅 HEIF 图片处理。
- 隐私方面的改进。客户端需要某些密钥才能获取
CAMERA
权限,然后才能从CameraCharacteristics
中进行检索。请参阅getKeysNeedingPermission
。
相机 HAL
Android 10 中更新了以下相机 HAL 版本。
3.5
ICameraDevice
-
getPhysicalCameraCharacteristics
:某个支持逻辑相机设备的实体相机 ID 的静态相机信息。请参阅多摄像头支持。 isStreamCombinationSupported
:此方法支持公共 API,可帮助客户端查询是否支持某个会话配置。请参阅使用 API 查询数据流组合。
ICameraDeviceSession
-
isReconfigurationNeeded
:此方法可告知相机框架,可能的新会话参数值是否需要完整的数据流重新配置。这有助于避免不必要的相机重新配置延迟。请参阅会话重新配置查询。 - HAL 缓冲区管理 API:这些 API 允许相机 HAL 仅在需要时从相机框架请求缓冲区,而不是将每个捕获请求与整个相机流水线中的相关缓冲区进行耦合,从而可能节省大量内存。
-
signalStreamFlush
:向 HAL 发出信号,指明相机服务即将执行configureStreams_3_5
,HAL 必须返回指定数据流的所有缓冲区。 -
configureStreams_3_5
:类似于ICameraDevice3.4.configureStreams
,但除此之外会提供streamConfigCounter
计数器,以检查configureStreams_3_5
和signalStreamFlush
调用之间的竞态条件。
-
ICameraDeviceCallback
更新:
-
requestStreamBuffers
:供相机 HAL 调用的同步回调函数,用于向相机服务器索取缓冲区。请参阅requestStreamBuffers
。 -
returnStreamBuffers
:供相机 HAL 调用的同步回调函数,用于向相机服务器返回输出缓冲区。请参阅returnStreamBuffers
。
3.4
Android 10 的相机元数据中添加了以下键。
- 图片格式
ANDROID_SCALER_AVAILABLE_FORMATS_RAW10
ANDROID_SCALER_AVAILABLE_FORMATS_RAW12
ANDROID_SCALER_AVAILABLE_FORMATS_Y8
- 相机元数据标志
ANDROID_REQUEST_CHARACTERISTIC_KEYS_NEEDING_PERMISSION
ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS
ANDROID_SCALER_AVAILABLE_RECOMMENDED_INPUT_OUTPUT_FORMATS_MAP
ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION
ANDROID_DEPTH_AVAILABLE_RECOMMENDED_DEPTH_STREAM_CONFIGURATIONS
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS
ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS
ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS
ANDROID_HEIC_INFO_SUPPORTED
ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
- 功能
-
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA
-
ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
键的值ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO
ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR
- 可用的动态深度数据流配置
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_OUTPUT
ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS_INPUT
- 可用的 HEIC 数据流配置
-
ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_OUTPUT
ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS_INPUT
-
相机模块
Android 10 中更新了以下相机模块版本。
2.5
- 为设备添加
notifyDeviceStateChange
方法,以便在物理更改(例如折叠)影响相机和路由时通知相机 HAL。
2.4
- 通过 API 级别 29 或更高级别启动的设备必须针对
isTorchModeSupported
报告true
。
Android 9
Android 9 版本对相机 API2 和 HAL 接口进行了以下更新。
相机 API
- 引入了多相机 API,以更好地支持多个相机朝向同一方向的设备,实现散景和无缝变焦等功能。这样,应用就可以将设备上的多个相机视为一个逻辑单元(逻辑相机)。拍摄请求也可以发送到同一个逻辑相机下属的多个相机设备。请参阅多相机支持。
- 引入会话参数。会话参数是可用拍摄参数的一个子集,在进行修改时会导致严重的处理延迟。如果客户端在拍摄会话初始化期间传递其初始值,则可以减少这些开销。请参阅会话参数。
- 添加了光学防抖 (OIS) 数据键,以实现应用级稳定性和效果。请参阅
STATISTICS_OIS_SAMPLES
。 - 添加了外部闪存支持。请参阅
CONTROL_AE_MODE_ON_EXTERNAL_FLASH
。 - 在
CAPTURE_INTENT
中添加了动作跟踪 intent。请参阅CONTROL_CAPTURE_INTENT_MOTION_TRACKING
。 - 弃用了
LENS_RADIAL_DISTORTION
并在其位置添加了LENS_DISTORTION
。 - 在
CaptureRequest
中添加了失真校正模式。请参阅DISTORTION_CORRECTION_MODE
。 - 在支持的设备上添加了对外部 USB/UVC 相机的支持。请参阅
INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL
。
相机 HAL
3.4
ICameraDeviceSession
更新
configureStreams_3_4
:添加了对sessionParameters
和逻辑相机的支持。processCaptureRequest_3_4
:支持在数据流结构中包含实体相机 ID。
ICameraDeviceCallback
更新
-
processCaptureResult_3_4
:在拍摄结果中添加了实体相机元数据。
3.3
Android 9 的相机元数据中添加了以下键。
- 功能
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
- 相机元数据标记
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
ANDROID_DISTORTION_CORRECTION_AVAILABLE_MODES
ANDROID_LENS_POSE_REFERENCE
-
ANDROID_LENS_DISTORTION
ANDROID_REQUEST_AVAILABLE_SESSION_KEYS
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
ANDROID_STATISTICS_OIS_DATA_MODE
ANDROID_STATISTICS_OIS_TIMESTAMPS
ANDROID_STATISTICS_OIS_X_SHIFTS
ANDROID_STATISTICS_OIS_Y_SHIFTS
Android 8.0
Android 8.0 版本引入了 Treble。引入 Treble 后,供应商相机 HAL 实现必须为绑定式。Android 8.0 还包含对相机服务的以下主要增强功能:
- 共享 surface - 可让多个 surface 共享同一个
OutputConfiguration
- 适用于自定义相机模式的系统 API
onCaptureQueueEmpty
有关这些功能的详细信息,请参阅以下部分。
共享 surface
借助此功能,只需一组缓冲区就可以驱动两个输出(例如预览和视频编码),从而降低功耗和内存消耗。如需支持此功能,设备制造商需要确保其相机 HAL 和 gralloc HAL 实现可以创建由多个不同使用方(而不是仅一个使用方;例如硬件混合渲染器/GPU 和视频编码器)使用的 gralloc 缓冲区。相机服务将使用方使用情况标志传递到相机 HAL 和 gralloc HAL;它们需要分配正确的缓冲区类型,或者相机 HAL 需要返回一个错误,表明该使用方组合不受支持。
有关其他详细信息,请参阅
enableSurfaceSharing
开发者文档。
适用于自定义相机模式的系统 API
公共相机 API 定义了两种操作模式:正常模式和受限高速录制模式。这两种模式的语义截然不同;例如,高速模式受限于一次最多只能有两个具体输出。各个原始设备制造商 (OEM) 都表示有兴趣为硬件特定功能定义其他自定义模式。实际上,该模式只是一个传递到 configure_streams
的整数。请参阅 hardware/camera/device/3.2/ICameraDeviceSession#configurestreams
。
此功能包括一个系统 API 调用,原始设备制造商 (OEM) 的相机应用可以使用该调用来启用自定义模式。这些自定义模式必须以整数值 0x8000 开头,以避免与未来添加到公共 API 的模式发生冲突。
如需支持此功能,原始设备制造商 (OEM) 只需将新模式添加到其 HAL 即可,传递至 HAL 的这一整数会在 configure_streams 上触发该模式,然后原始设备制造商 (OEM) 就可以让其自定义相机应用使用系统 API。
方法名称为
android.hardware.camera2.CameraDevice#createCustomCaptureSession
。请参阅 frameworks/base/core/java/android/hardware/camera2/CameraDevice
。
onCaptureQueueEmpty
此 API 的目的是通过尽可能让请求队列为空,来缩短控制更改(如变焦)的延迟时间。onCaptureQueueEmpty
不需要 HAL 发挥作用;它只是一种框架端补充。想要利用此 API 的应用需要向该回调添加监听器,并相应地做出响应。通常,响应方式是向相机设备发送另一个拍摄请求。
相机 HIDL 接口
相机 HIDL 接口在相机 HAL 接口(使用以 HIDL 定义的稳定 API)基础上进行了全面改造。在最近的旧版本 3.4 和 2.4(针对相机模块)中引入的所有功能和相机功能也是 HIDL 定义的一部分。
3.4
对受支持的元数据添加了少许内容并对 data_space 支持进行了更改:
- 如果支持
RAW_OPAQUE
格式,则必须强制添加ANDROID_SENSOR_OPAQUE_RAW_SIZE
静态元数据。 - 如果支持任何 RAW 格式,则必须强制添加
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE
静态元数据。 - 使用数据空间编码的版本 0 定义,将
camera3_stream_t data_space
字段切换为更灵活的定义。 - 可用于 HALv3.2 或更高版本的常规元数据添加项:
-
ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST
ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE
ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL
ANDROID_SENSOR_DYNAMIC_WHITE_LEVEL
ANDROID_SENSOR_OPAQUE_RAW_SIZE
ANDROID_SENSOR_OPTICAL_BLACK_REGIONS
-
3.3
扩展功能 HAL 的小修订:
- OPAQUE 和 YUV 重新处理 API 更新。
- 对深度输出缓冲区的基本支持。
- 为
camera3_stream_t
添加了data_space
字段。 - 为
camera3_stream_t
添加了旋转字段。 - 为
camera3_stream_configuration_t
添加了 camera3 数据流配置操作模式。
3.2
扩展功能 HAL 的小修订:
- 弃用了
get_metadata_vendor_tag_ops
。在camera_common.h
中改用get_vendor_tag_ops
。 - 弃用了
register_stream_buffers
。框架在process_capture_request
中提供给 HAL 的所有 gralloc 缓冲区在任何时候可能都是新的。 - 添加了部分结果支持。在获得完整结果之前,通过多次调用
process_capture_result
可以获得可用结果的子集。 - 为
camera3_request_template
添加了手动模板。应用可以使用此模板直接控制拍摄设置。 - 重新制定双向和输入流规范。
- 更改输入缓冲区返回路径。缓冲区在
process_capture_result
而不是process_capture_request
中返回。
3.1
扩展功能 HAL 的小修订:
configure_streams
将使用方使用情况标志传递给 HAL。- 刷新调用以尽可能快地丢弃所有传输中的请求/缓冲区。
3.0
扩展功能 HAL 的首次修订:
- 重要版本更改,因为 ABI 完全不同。在所需的硬件功能或操作模式方面,与 2.0 相比没有更改。
- 重新设计了输入请求和流队列接口:框架调用 HAL 且后续请求和流缓冲区已经出队。包含同步框架支持,这是高效实现所必需的。
- 已将触发器移动到请求中,将大多数通知移动到结果中。
- 将框架中的所有回调合并到一个结构中,并将所有设置方法合并到单个
initialize()
调用中。 - 将数据流配置整合到单个调用中,从而简化数据流管理。双向数据流取代了
STREAM_FROM_STREAM
构造。 - 为较旧/受限的硬件设备限制了模式语义。
2.0
初始版本的扩展功能 HAL (Android 4.2) [camera2.h]:
- 足以实现现有的
android.hardware.Camera
API。 - 允许用于相机服务层中的 ZSL 队列。
- 未针对任何新功能(如手动捕获控制、Bayer RAW 捕获,RAW 数据的重新处理等)进行测试。
1.0
初始 Android 相机 HAL (Android 4.0) [camera.h]:
- 已从 C++ CameraHardwareInterface 抽象层进行转换。
- 支持
android.hardware.Camera
API。
相机模块版本历史记录
本部分包含相机硬件模块的模块版本控制信息(基于 camera_module_t.common.module_api_version
)。两个最高有效十六进制数字表示主要版本,两个最低有效十六进制数字表示次要版本。
2.4
此相机模块版本添加了以下 API 更改:
- 手电筒模式支持:框架可以为具有闪光灯元件的任何相机设备打开手电筒模式,而无需打开相机设备。相机设备对闪光灯元件的访问优先级高于相机模块;如果已通过模块接口启用手电筒,则打开相机设备会关闭手电筒。当出现任何资源冲突时(例如调用
open()
以打开相机设备),相机 HAL 模块必须通过手电筒模式状态回调告知框架手电筒模式已关闭。 - 外部相机(例如 USB 热插拔相机)支持。仅当相机已连接且准备好用于外部热插拔相机时,API 更新才会指明相机静态信息可用。当相机状态不是
CAMERA_DEVICE_STATUS_PRESENT
时,获取静态信息的调用为无效调用。框架仅依赖设备状态更改回调来管理可用的外部相机列表。 - 相机仲裁提示:添加了相关支持,以明确指明可以同时打开和使用的相机设备数量。为了指定有效的设备组合,应始终在由
get_camera_info
调用返回的camera_info
结构中设置resource_cost
和conflicting_devices
字段。 - 模块初始化方法:在加载 HAL 模块后由相机服务调用,以允许初始化 HAL 一次。该方法在调用任何其他模块方法之前调用。
2.3
该相机模块版本添加了对打开旧版相机 HAL 设备的支持。如果同一设备可以支持多个设备 API 版本,则框架利用该支持可以打开相机设备作为较低版本的 HAL 设备。
标准硬件模块打开调用 (common.methods->open
) 会继续使用支持的最新版本(即 camera_info_t.device_version
中列出的版本)打开相机设备。
2.2
该相机模块版本添加了模块供应商标记支持,并且弃用了以前只有在设备打开时才能访问的旧版 vendor_tag_query_ops
。
2.1
该相机模块版本添加了对从相机 HAL 模块到框架的异步回调支持,利用该支持可以通知框架关于相机模块状态的更改。提供有效 set_callbacks()
方法的模块必须至少报告此版本号。
2.0
报告此版本号的相机模块会实现相机模块 HAL 接口的第二个版本。可通过此模块打开的相机设备可能支持 1.0 版本或 2.0 版本的相机设备 HAL 接口。camera_info 的 device_version
字段始终有效;如果 device_version
字段为 2.0 或更高版本,则 camera_info
的 static_camera_characteristics
字段有效。
1.0
报告这些版本号的相机模块实现了初始相机模块 HAL 接口。可通过此模块打开的所有相机设备仅支持版本 1 的相机设备 HAL。camera_info
的 device_version
和 static_camera_characteristics
字段无效。此模块及其设备仅支持 android.hardware.Camera
API。