本页面详细介绍了相机 HAL、API 和相关兼容性测试套件 (CTS)测试中的版本差异。本页面还介绍了为强化和保护 Android 7.0 中的相机框架而做出的多项架构变更、Android 8.0 中切换到 Treble 的情况,以及供应商为在其相机实现中支持这些变更而必须进行的更新。
术语
本页面使用了以下术语
- Camera API1
- Android 4.4 及更低版本设备上的应用级相机框架,通过
android.hardware.Camera
类公开。 - Camera API2
- Android 5.0 及更高版本设备上的应用级相机框架,通过
android.hardware.camera2
软件包公开。 - 相机 HAL
- SoC 供应商实现的摄像头模块层。应用级公共框架构建于摄像头 HAL 之上。
- Camera HAL3.1
- Android 4.4 发布的摄像头设备 HAL 版本。
- Camera HAL3.2
- Android 5.0 发布的摄像头设备 HAL 版本。
- Camera API1 CTS
- 在 Camera API1 之上运行的一组摄像头 CTS 测试。
- Camera API2 CTS
- 在 Camera API2 之上运行的另一组摄像头 CTS 测试。
- Treble
- 通过新的供应商接口将供应商实现(设备特定的、由芯片制造商编写的较低级别软件)与 Android 操作系统框架分离。
- HIDL
- Treble 引入的 HAL 接口定义语言,用于指定 HAL 及其用户之间的接口。
- VTS
- 与 Treble 一起引入的 供应商测试套件。
Camera API
Android 包括以下摄像头 API。
Camera API1
Android 5.0 弃用了 Camera API1,随着新的平台开发专注于 Camera API2,Camera API1 将继续被逐步淘汰。但是,淘汰期将很长,Android 版本将在一段时间内继续支持 Camera API1 应用。具体而言,对以下各项的支持将继续:
- 适用于应用的 Camera API1 接口。构建于 Camera API1 之上的摄像头应用应像在运行较低 Android 版本的设备上一样工作。
- Camera HAL 版本。包括对 Camera HAL1.0 的支持。
Camera API2
Camera API2 框架向应用公开了更低级别的摄像头控制,包括高效的零拷贝连拍/流式传输流程以及对曝光、增益、白平衡增益、色彩转换、降噪、锐化等的逐帧控制。有关详细信息,请观看 Google I/O 视频概述。
Android 5.0 及更高版本包括 Camera API2;但是,运行 Android 5.0 及更高版本的设备可能不支持所有 Camera API2 功能。应用可以通过 Camera API2 接口查询的 android.info.supportedHardwareLevel
属性报告以下支持级别之一:
LEGACY
:这些设备通过 Camera API2 接口向应用公开的功能与通过 Camera API1 接口向应用公开的功能大致相同。传统框架代码在概念上将 Camera API2 调用转换为 Camera API1 调用;传统设备不支持 Camera API2 功能,例如逐帧控制。LIMITED
:这些设备支持某些 Camera API2 功能(但并非全部),并且必须使用 Camera HAL 3.2 或更高版本。FULL
:这些设备支持 Camera API2 的所有主要功能,并且必须使用 Camera HAL 3.2 或更高版本以及 Android 5.0 或更高版本。LEVEL_3
:这些设备支持 YUV 重新处理和 RAW 图像捕获,以及额外的输出流配置。EXTERNAL
:这些设备类似于LIMITED
设备,但有一些例外;例如,某些传感器或镜头信息可能未报告或帧速率不太稳定。此级别用于外部摄像头,例如 USB 网络摄像头。
各个功能通过 Camera API2 接口中的 android.request.availableCapabilities
属性公开。FULL
设备需要 MANUAL_SENSOR
和 MANUAL_POST_PROCESSING
功能以及其他功能。RAW
功能即使对于 FULL
设备也是可选的。LIMITED
设备可以通告这些功能的任何子集,包括无子集。但是,必须始终定义 BACKWARD_COMPATIBLE
功能。
设备的受支持硬件级别以及其支持的特定 Camera API2 功能作为以下功能标志提供,以允许 Google Play 过滤 Camera 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 及更高版本的设备必须通过 Camera API1 CTS、Camera API2 CTS 和 CTS 验证程序摄像头测试。
不具备 Camera HAL3.2 实现且无法支持完整 Camera API2 接口的设备仍然必须通过 Camera API2 CTS 测试。但是,设备在 Camera API2 LEGACY
模式下运行(其中 Camera API2 调用在概念上映射到 Camera API1 调用),因此会自动跳过与 Camera API1 之外的功能或能力相关的任何 Camera API2 CTS 测试。
在传统设备上,运行的 Camera API2 CTS 测试使用现有的公共 Camera API1 接口和功能,而没有新的要求。暴露的错误(以及导致 Camera API2 CTS 失败的错误)是设备现有 Camera HAL 中已存在的错误,因此会被现有的 Camera API1 应用发现。我们预计不会出现许多此类错误(但是,必须修复任何此类错误才能通过 Camera API2 CTS 测试)。
VTS 要求
运行 Android 8.0 及更高版本且具有绑定器化 HAL 实现的设备必须通过摄像头 VTS 测试。
摄像头框架强化
为了加强媒体和摄像头框架的安全性,Android 7.0 将摄像头服务移出 mediaserver。从 Android 8.0 开始,每个绑定器化 Camera HAL 都在与摄像头服务分离的进程中运行。供应商可能需要在摄像头 HAL 中进行更改,具体取决于所使用的 API 和 HAL 版本。以下部分详细介绍了 HAL1 和 HAL3 的 AP1 和 AP2 中的架构更改以及一般要求。
API1 的架构更改
API1 视频录制可能会假定摄像头和视频编码器位于同一进程中。在 HAL3 上使用 API1 时,其中摄像头服务使用 BufferQueue 在进程之间传递缓冲区,无需供应商更新。
- HAL3,其中摄像头服务使用 BufferQueue 在进程之间传递缓冲区,无需供应商更新。
图 1. HAL3 上 API1 中的 Android 7.0 摄像头和媒体堆栈
- HAL1 支持在视频缓冲区中传递元数据,供应商必须更新 HAL 以使用
kMetadataBufferTypeNativeHandleSource
。(Android 7.0 中不再支持kMetadataBufferTypeCameraSource
。)图 2. HAL1 上 API1 中的 Android 7.0 摄像头和媒体堆栈
API2 的架构更改
对于 HAL1 或 HAL3 上的 API2,BufferQueue 传递缓冲区,因此这些路径继续有效。HAL1 上 API2 的 Android 7.0 架构不受 cameraservice 移动的影响,无需供应商更新。
- HAL1 不受 cameraservice 移动的影响,无需供应商更新。
- HAL3 受影响,但无需供应商更新。
图 3. HAL3 上 API2 中的 Android 7.0 摄像头和媒体堆栈
其他要求
为加强媒体和摄像头框架安全性而进行的架构更改包括以下其他设备要求。
- 常规。由于 IPC,设备需要额外的带宽,这可能会影响时间敏感的摄像头用例,例如高速视频录制。供应商可以通过运行
android.hardware.camera2.cts.PerformanceTest
和 Google Camera 应用进行 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 后,缓冲区句柄地址 A 在下次 HAL 接收时可能会存储缓冲区句柄 B。
- 更新 cameraserver 的 SELinux 策略。如果设备特定的 SELinux 策略为 mediaserver 提供了运行摄像头的权限,则必须更新 SELinux 策略以为 cameraserver 提供正确的权限。我们不建议为 cameraserver 复制 mediaserver 的 SELinux 策略(因为 mediaserver 和 cameraserver 通常需要系统中的不同资源)。Cameraserver 应仅具有执行摄像头功能所需的权限,并且应删除 mediaserver 中任何不必要的摄像头相关权限。
- Camera HAL 和 cameraserver 之间的分离。Android 8.0 及更高版本还在与 cameraserver 不同的进程中分离了绑定器化 Camera HAL。IPC 通过 HIDL 定义的 接口进行。
验证
对于所有包含摄像头并运行 Android 7.0 的设备,请通过运行 Android 7.0 CTS 来验证实现。尽管 Android 7.0 不包含验证摄像头服务更改的新 CTS 测试,但如果您未进行上述更新,则现有 CTS 测试将失败。
对于所有包含摄像头并运行 Android 8.0 及更高版本的设备,请通过运行 VTS 来验证供应商实现。
Camera HAL 版本历史记录
有关评估 Android Camera HAL 的可用测试列表,请参阅 Camera HAL 测试清单。
Android 10
Android 10 引入了以下更新。
Camera API
- 多摄像头改进,允许通过隐藏物理摄像头 ID 单独或通过相应的逻辑摄像头使用物理摄像头。请参阅多摄像头支持。
- 能够检查是否支持特定的会话配置,而无需创建新会话的性能开销。请参阅
CameraDevice
。 - 能够检索给定用例的建议流配置,以使客户端更节能且性能更高。请参阅
getRecommendedStreamConfigurationMap
。 - 支持 深度 JPEG 图像格式。有关更多详细信息,请参阅 动态深度规范。
- 支持 HEIC 图像格式。请参阅 HEIF 成像。
- 隐私改进。某些键需要客户端拥有
CAMERA
权限才能从CameraCharacteristics
中检索。请参阅getKeysNeedingPermission
。
相机 HAL
以下 Camera HAL 版本在 Android 10 中更新。
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 接口的更新。
Camera API
- 引入了多摄像头 API,以更好地支持具有多个朝向相同方向的摄像头的设备,从而实现散景和无缝变焦等功能。这允许应用将设备上的多个摄像头视为一个逻辑单元(逻辑摄像头)。捕获请求也可以发送到由一个逻辑摄像头包含的各个摄像头设备。请参阅 多摄像头支持。
- 引入了会话参数。会话参数是可以导致修改时出现严重处理延迟的可用捕获参数的子集。如果客户端在捕获会话初始化期间传递其初始值,则可以缓解这些成本。请参阅 会话参数。
- 为应用级稳定和效果添加了光学防抖 (OIS) 数据键。请参阅
STATISTICS_OIS_SAMPLES
。 - 添加了外部闪光灯支持。请参阅
CONTROL_AE_MODE_ON_EXTERNAL_FLASH
。 - 在
CAPTURE_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,供应商 Camera 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 中,由传递到 configure_streams 的此整数触发,然后让其自定义摄像头应用使用系统 API。
方法名称为 android.hardware.camera2.CameraDevice#createCustomCaptureSession
。请参阅: frameworks/base/core/java/android/hardware/camera2/CameraDevice
。
onCaptureQueueEmpty
此 API 的目的是通过尽可能保持请求队列为空来减少诸如缩放之类的控制更改的延迟。onCaptureQueueEmpty
不需要 HAL 工作;它纯粹是框架侧的添加。想要利用它的应用需要向该回调添加侦听器并做出适当的响应。通常,这是通过向摄像头设备发送另一个捕获请求来实现的。
Camera HIDL 接口
Camera HIDL 接口是对 Camera 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
静态元数据作为强制性元数据。 - 使用 dataspace 编码的版本 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 更新。
- 对深度输出缓冲区的基本支持。
- 将
data_space
字段添加到camera3_stream_t
。 - 将 rotation 字段添加到
camera3_stream_t
。 - 将 camera3 流配置操作模式添加到
camera3_stream_configuration_t
。
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 版本 HAL 设备打开。标准硬件模块打开调用 (common.methods->open
) 继续使用最新支持的版本打开摄像头设备,这也是 camera_info_t.device_version
中列出的版本。
2.2
此摄像头模块版本添加了来自模块的供应商标记支持,并弃用了旧的 vendor_tag_query_ops
,该标记以前只能通过打开设备访问。
2.1
此摄像头模块版本添加了对摄像头 HAL 模块异步回调框架的支持,该回调用于通知框架有关摄像头模块状态的更改。提供有效 set_callbacks()
方法的模块必须至少报告此版本号。
2.0
报告此版本号的摄像头模块实现了摄像头模块 HAL 接口的第二个版本。可通过此模块打开的摄像头设备可以支持摄像头设备 HAL 接口的版本 1.0 或版本 2.0。camera_info
的 device_version
字段始终有效;如果 device_version
字段为 2.0 或更高版本,则 camera_info
的 static_camera_characteristics
字段有效。
1.0
报告这些版本号的摄像头模块实现了初始摄像头模块 HAL 接口。可通过此模块打开的所有摄像头设备仅支持摄像头设备 HAL 的版本 1。camera_info
的 device_version
和 static_camera_characteristics
字段无效。此模块及其设备只能支持 android.hardware.Camera
API。