Android Camera 开发相机应用相关 API2 介绍,以及使用示例。
基础
camera 各个版本
Camera API1Android 4.4或更低版本设备上的应用级相机框架,通过android.hardware.Camera类提供。Camera API2Android 5.0及更高版本设备上的应用级相机框架,通过android.hardware.camera2包提供。Camera HAL
由SoC供应商实现的相机模块层。该应用级公共框架基于Camera HAL构建而成。Camera HAL3.1
随Android 4.4发布的相机设备HAL版本。Camera HAL3.2
随Android 5.0发布的相机设备HAL版本。
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 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。Android 5.0 及更高版本提供 Camera API2;但是运行 Android 5.0 及更高版本的设备可能并不支持所有 Camera API2 功能。应用可通过 Camera API2 接口查询 android.info.supportedHardwareLevel 属性。该属性会报告以下支持级别之一:
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY旧版
这些设备通过Camera API2接口为应用提供功能,而且这些功能与通过Camera API1接口提供给应用的功能大致相同。旧版框架代码在概念上将Camera API2调用转换为Camera API1调用;旧版设备不支持Camera API2功能,例如每帧控件。INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED有限
这些设备支持部分(但不是全部)Camera API2功能,并且必须使用Camera HAL 3.2或更高版本。INFO_SUPPORTED_HARDWARE_LEVEL_FULL全面
这些设备支持Camera API2的所有主要功能,并且必须使用Camera HAL 3.2或更高版本以及Android 5.0或更高版本。INFO_SUPPORTED_HARDWARE_LEVEL_3级别 3
这些设备支持YUV重新处理和RAW图片捕获,以及其他输出流配置。INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL外部
这些设备类似于LIMITED设备,但有一些例外情况;例如某些传感器或镜头信息可能未被报告或具有较不稳定的帧速率。此级别用于外部相机(如USB网络摄像头)。
各个模式支持的功能级别 LEGACY < LIMITED < FULL < LEVEL_3 ;各项功能通过 Camera API2 接口中的 android.request.availableCapabilities 属性提供。FULL 设备需要具备 MANUAL_SENSOR 和 MANUAL_POST_PROCESSING 等功能。但即使是 FULL 设备,也并非必须实现 RAW 功能。 LIMITED 设备可以提供这些功能的任何子集,甚至可以不提供其中任何功能。但是必须始终定义 BACKWARD_COMPATIBLE 功能。
设备支持的硬件级别及其支持的特定 Camera API2 功能采用以下功能标记的形式指明,APP 在使用时,在 AndroidManifest.xml 中通过 uses-feature 来声明使用的功能:
1 | android.hardware.camera.hardware_level.full |
HAL 新旧版本架构图
从 Android 8.0 开始,相机 HAL 实现了 HIDL 接口;而旧版本架构和新版本主要体现在 HIDL 上。
基于 HIDL 的架构图
旧版架构图
Camera各版本介绍详细参考:Android Camera 架构 , Android Camera 版本支持
Camera2 类图结构

各个类功能简介
CameraManager
相机设备管理员,用于检测相机设备,开启相机设备,获取相机设备支持的特性等等。CameraDevice
表示物理或逻辑摄像头,类似老版本中的Camera类,是对传感器相关功能的封装。CameraCaptureSessionCamera应用程序和CameraDevice硬件之间建立的一个会话类,用于从相机捕获图像或重新处理先前在同一会话中从相机捕获的图像,捕获到的图像输出到目标Surface中。为应用程序主要提供预览setRepeatingRequest和拍照capture功能。CameraMetadata
是一个数据结构,包含了CameraDevice控制命令和相关信息。CameraMetadata用于查询CameraDevice属性、捕获结果、设置请求参数的基本键/值映射。CameraMetadata的所有实例都是不可变的。CaptureRequest
表示从CameraDevice获取捕获数据的请求,包含对CameraDevice的参数设置,算法控制,输出缓冲区等等。CaptureResult
表示从CameraDevice获取到数据的结果子集;包含捕获硬件(传感器,镜头,闪存),控制算法和输出缓冲区的最终配置等的子集;CaptureResult对象实例是不可变的。CameraCharacteristics
用来描述CameraDevice设备的属性,这些属性是不可修改的,设备出厂时提供的;可以通过CameraManager.getCameraCharacteristics(String cameraID)来查询当前设备支持哪些属性。
基本结构

在 Camera2 的架构中,APP 和 CameraDevice 之间通过 Pipeline 管道来连接。
CameraCaptureSession充当管道的功能APP向CameraDevice发送CaptureRequestCameraDevices收到请求后返回对应数据到对应的Surface:通常TextureView用来预览,ImageReader用来拍照保存
简化使用流程图

CameraManager
CameraManager 相机设备管理员,用于检测相机设备,开启相机设备,获取相机设备支持的特性等等。
API 方法
CameraManager 提供的 API 非常简单,围绕着类的主要功能:
1 | public final class CameraManager { |
AvailabilityCallback 回调
CameraManager.AvailabilityCallback 表示相机设备开启后状态,变为有效或无效状态。
1 | public static abstract class AvailabilityCallback { |
TorchCallback 回调
CameraManager.TorchCallback 闪光灯用作手电筒的回调接口,表示闪光灯处于开启手电筒、关闭、或者无效状态。
1 | public static abstract class TorchCallback { |
CameraDevice
CameraDevice 表示物理或逻辑摄像头,类似老版本中的 Camera 类,是对传感器相关功能的封装。使用前需要注意:
- 权限
CameraDevice使用前需要申请权限<uses-permission android:name="android.permission.CAMERA" />。 - 支持功能的级别
通过CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL查看当前手机平台支持的功能级别。如果支持LEGACY级别,则摄像机设备以向后兼容模式运行,并且支持最小的Camera2 API;如果支持LIMITED级别,则Camera2 API是和旧版Camera API大致相同的功能集,但界面更清晰效率更高;如果支持EXTERNAL级别,则该设备是可移动摄像头,提供与LIMITED级别相似但略少的功能;如果支持FULL, LEVEL3级别,API将提供显着改进的功能。如果开发的Camera应用程序需要一个完整级别的设备才能正常运行,需要请在清单中声明android.hardware.camera.level.full功能。
常量
CameraDevice 中控制模板常量:
TEMPLATE_MANUAL
手动控制模板,禁用所有的自动控制3A算法。TEMPLATE_PREVIEW
创建适合相机预览的窗口,高帧率优于高质量的后期处理。TEMPLATE_RECORD
创建适合录像的请求,使用稳定的帧率。TEMPLATE_STILL_CAPTURE
创建适合拍照的请求,优先考虑帧速率的图像质量。TEMPLATE_VIDEO_SNAPSHOT
创建录像时快照的请求,在不中断录像的前提下最大化图像质量。TEMPLATE_ZERO_SHUTTER_LAG
创建ZSL零延时拍照请求,在不影响帧率的前提下最大化图像质量,并开启3A算法。
API 方法
CameraDevice 中 API 简介:
1 | public abstract class CameraDevice implements AutoCloseable { |
StateCallback 回调
CameraDevice.StateCallback 状态回调接口,在 CameraManager.open 打开摄像头时,必须提供该回调接口;表示当前 CameraDevice 的状态。CameraDevice.StateCallback 中设备错误常量,在 onError() 方法中返回:
ERROR_CAMERA_DEVICE:开启设备时遇到致命错误ERROR_CAMERA_DISABLED:由于设备策略,无法开启摄像头ERROR_CAMERA_IN_USE:当前开启设备正在被使用ERROR_CAMERA_SERVICE:CameraService致命错误ERROR_MAX_CAMERAS_IN_USE:开启的设备已经达到最大数量
1 | public static abstract class StateCallback { |
CameraCaptureSession
抽象类;Camera 应用程序和 CameraDevice 硬件之间建立的一个会话类,用于从相机捕获图像或重新处理先前在同一会话中从相机捕获的图像,捕获到的图像输出到目标 Surface 中。为应用程序主要提供预览 setRepeatingRequest 和拍照 capture 功能。
CameraCaptureSession 创建非常耗时,可能需要几百毫秒,因为它需要配置摄像机设备的内部管道并分配内存缓冲区以将图像发送到所需目标,因此需要异步去完成。在 CameraDevice 中有两种方式创建:
createCaptureSessioncreateReprocessableCaptureSession:可以重新处理先前在同一会话中从摄像机捕获的图像
API 方法
CameraCaptureSession 中 API 简介:
1 | public abstract class CameraCaptureSession implements AutoCloseable { |
StateCallback 回调
CameraCaptureSession.StateCallback 状态回调接口,表示会话创建成功后或者会话有内容变化时会触发回调。CameraCaptureSession 创建成功后处于活动状态,直到摄像机设备创建新会话或关闭摄像机设备。创建成功后会触发 onConfigured 回调;如果无法完成配置,则会触发 onConfigureFailed,并且会话不会变为活动状态。新会话创建成功,则会关闭先前的会话,并会触发其 onClosed 回调。如果在会话关闭后调用,则所有会话方法都将抛出 IllegalStateException。
回调接口有如下几个方法,其中 onConfigured, onConfigureFailed 是抽象类,需要在子类中实现:
1 | public static abstract class StateCallback { |
CaptureCallback 回调
CameraCaptureSession.CaptureCallback 捕获回调接口,表示 CameraDevice 在接收到数据更新时的回调:
1 | public static abstract class CaptureCallback { |
CameraConstrainedHighSpeedCaptureSession
抽象类,继承 CameraCaptureSession ,表示高速捕获会话,支持大于等于 120 帧/秒的录像。只有一个公共并且是抽象的方法 createHighSpeedRequestList ,表示创建高速请求列表。
1 | public abstract class CameraConstrainedHighSpeedCaptureSession |
CaptureFailure
CaptureFailure 类表示拍照失败,包含了失败的具体信息;在 CameraCaptureSession.CaptureCallback 回调接口的 onCaptureFailed 中返回该类。
常量
CaptureFailure 中包含两个表示失败原因的常量:
REASON_ERROR:framework中出现的错误,导致当前帧丢弃了CaptureResultREASON_FLUSHED:因为调用了CameraCaptureSession.abortCaptures()导致的捕获失败
API 方法
CaptureFailure 中 API 简介:
1 | public class CaptureFailure { |
CameraMetadata
抽象类,是一个数据结构,包含了 CameraDevice 控制命令和相关信息。CameraMetadata 用于查询 CameraDevice 属性、捕获结果、设置请求参数的基本键/值映射。CameraMetadata 的所有实例都是不可变的,整个抽象类只提供一个公共方法:
1 | public List<TKey> getKeys() { |
从实现中可以看出 getKeys() 方法返回的键列表是永远不会更改的,任何键在整个对象生命周期内返回的值也不会更改。
CameraMetadata中定义的常量非常多,详细含义需要参考API中的详解。
常量
CameraMetadata 支持的常量及对应含义:
- 色差校准模式
COLOR_CORRECTION_ABERRATIONCOLOR_CORRECTION_ABERRATION_MODE_FAST:色差校准时不会减慢传感器的捕获速率COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY:色差校准时提高图像质量,但是传感器捕获率会降低COLOR_CORRECTION_ABERRATION_MODE_OFF:关闭色差校准模式 - 颜色校准模式
COLOR_CORRECTIONCOLOR_CORRECTION_MODE_FAST:颜色校准不会减慢传感器的捕获速率COLOR_CORRECTION_MODE_HIGH_QUALITY:颜色校准时提高图片质量,但是传感器捕获率会被降低;可以用来做高级白平衡调整COLOR_CORRECTION_MODE_TRANSFORM_MATRIX:使用矩阵转换,但是必须要禁用高级白平衡 - 避免灯源工频干扰模式
ANTIBANDINGCONTROL_AE_ANTIBANDING_MODE_50HZ:CameraDevice调整曝光持续时间以避免50Hz照明光源干扰产生的明暗条纹问题CONTROL_AE_ANTIBANDING_MODE_60HZ:避免60Hz照明光源的明暗条纹问题CONTROL_AE_ANTIBANDING_MODE_AUTO:默认模式,自动适配照明光源的频率,来避免明暗条纹问题CONTROL_AE_ANTIBANDING_MODE_OFF:不会调整曝光持续时间以避免出现明暗条纹问题 - 自动曝光模式
AECONTROL_AE_MODE_OFF:自动曝光关闭CONTROL_AE_MODE_ON:自动曝光打开CONTROL_AE_MODE_ON_ALWAYS_FLASH:自动曝光打开并总是闪光CONTROL_AE_MODE_ON_AUTO_FLASH:自动曝光打开并自动闪光CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:自动曝光打开,自动闪光并消除红眼CONTROL_AE_MODE_ON_EXTERNAL_FLASH:自动曝光,并打开外接闪光灯 - 测光序列
PRECAPTURECONTROL_AE_PRECAPTURE_TRIGGER_CANCEL:自动曝光前的测光序列,取消CONTROL_AE_PRECAPTURE_TRIGGER_IDLE:测光序列空闲CONTROL_AE_PRECAPTURE_TRIGGER_START:开启测光序列 - 自动曝光状态
AE_STATECONTROL_AE_STATE_CONVERGED:自动曝光状态良好CONTROL_AE_STATE_FLASH_REQUIRED:自动曝光状态良好,但是需要打开闪光灯CONTROL_AE_STATE_INACTIVE:自动曝光关闭,或者被重置CONTROL_AE_STATE_LOCKED:自动曝光锁定CONTROL_AE_STATE_PRECAPTURE:自动曝光需要发送测光序列CONTROL_AE_STATE_SEARCHING:这是瞬间状态,表示自动曝光还没设置好,正在搜索 - 自动对焦
AFCONTROL_AF_MODE_AUTO:基本自动对焦模式CONTROL_AF_MODE_CONTINUOUS_PICTURE:自动对焦连续的修改镜头位置以提供恒定对焦的图像流CONTROL_AF_MODE_CONTINUOUS_VIDEO:录像中的自动对焦CONTROL_AF_MODE_EDOF:扩展景深模式Extended depth of fieldCONTROL_AF_MODE_MACRO:特写聚焦模式CONTROL_AF_MODE_OFF:自动对焦模式关闭 - 自动对焦场景
AF_SCENECONTROL_AF_SCENE_CHANGE_DETECTED:自动对焦区域内检测到场景变化CONTROL_AF_SCENE_CHANGE_NOT_DETECTED:自动对焦区域场景变化不检测 - 自动对焦状态
AF_STATECONTROL_AF_STATE_ACTIVE_SCAN:自动对焦扫描CONTROL_AF_STATE_FOCUSED_LOCKED:自动对焦,焦点锁定CONTROL_AF_STATE_INACTIVE:自动对焦被关闭或者没有扫描过CONTROL_AF_STATE_NOT_FOCUSED_LOCKED:自动对焦焦点锁定失败CONTROL_AF_STATE_PASSIVE_FOCUSED:瞬态,自动对焦找到焦点,但是随时可能从新扫描CONTROL_AF_STATE_PASSIVE_SCAN:瞬态,自动对焦正在扫描CONTROL_AF_STATE_PASSIVE_UNFOCUSED:瞬态,自动对焦扫描后没有找到焦点,随时可以从新扫描 - 自动对焦触发器
AF_TRIGGERCONTROL_AF_TRIGGER_CANCEL:取消自动对焦触发器CONTROL_AF_TRIGGER_IDLE:触发器空闲CONTROL_AF_TRIGGER_START:触发器触发自动对焦 - 自动白平衡模式
AWECONTROL_AWB_MODE_AUTO:基本自动白平衡模式CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:自动白平衡关闭,使用阴天日光作为白平衡的假定场景照明CONTROL_AWB_MODE_DAYLIGHT:自动白平衡关闭,日光作为场景照明CONTROL_AWB_MODE_FLUORESCENT:自动白平衡关闭,荧光灯CONTROL_AWB_MODE_INCANDESCENT:自动白平衡关闭,白炽灯CONTROL_AWB_MODE_OFF:自动白平衡关闭CONTROL_AWB_MODE_SHADE:自动白平衡关闭,阴影CONTROL_AWB_MODE_TWILIGHT:自动白平衡关闭,暮光CONTROL_AWB_MODE_WARM_FLUORESCENT:自动白平衡关闭,暖荧光灯 - 自动白平衡状态
AWE_STATECONTROL_AWB_STATE_CONVERGED:自动白平衡状态良好CONTROL_AWB_STATE_INACTIVE:自动白平衡还没有开启自动模式,或者还没有开始测量CONTROL_AWB_STATE_LOCKED:自动白平衡锁定CONTROL_AWB_STATE_SEARCHING:瞬态,自动白平衡还没有找到合适的值,处于搜索状态 - 数据捕获请求
CAPTURE_INTENTCONTROL_CAPTURE_INTENT_CUSTOM:CameraDevice默认的数据捕获请求CONTROL_CAPTURE_INTENT_MANUAL:手动设置参数CONTROL_CAPTURE_INTENT_MOTION_TRACKING:运动跟踪CONTROL_CAPTURE_INTENT_PREVIEW:请求预览CONTROL_CAPTURE_INTENT_STILL_CAPTURE:请求拍照CONTROL_CAPTURE_INTENT_VIDEO_RECORD:请求录像CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT:请求视频快照CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG:ZSL零延时拍照请求 - 颜色效果模式
EFFECT_MODECONTROL_EFFECT_MODE_AQUA:蓝色色调AQUA模式CONTROL_EFFECT_MODE_BLACKBOARD:黑板模式,黑色区域带有白色或灰色细节CONTROL_EFFECT_MODE_MONO:MONO单色调模式,将图像映射为单一颜色CONTROL_EFFECT_MODE_NEGATIVE:NEGATIVE负片模式,图像的颜色反转CONTROL_EFFECT_MODE_OFF:颜色效果模式关闭CONTROL_EFFECT_MODE_POSTERIZE:POSTERIZE色调分离模式,图像使用离散的色调区域而不是连续的CONTROL_EFFECT_MODE_SEPIA:SEPIA棕褐色效果模式,图像被映射为暖灰色,红色和棕色色调CONTROL_EFFECT_MODE_SOLARIZE:SOLARIZE日晒效果模式,图像的色调完全或部分颠倒CONTROL_EFFECT_MODE_WHITEBOARD:白板模式,图像通常显示为白色区域,具有黑色或灰色细节 3A模式CONTROL_MODE_AUTO:3A: AE, AWE, AF都设置为自动模式CONTROL_MODE_OFF:关闭3A,所有的效果都是手动控制CONTROL_MODE_OFF_KEEP_STATE:和模式关闭相同,但是使用3A算法来更新统计信息CONTROL_MODE_USE_SCENE_MODE:使用特殊场景模式- 场景模式
SCENE_MODECONTROL_SCENE_MODE_ACTION:对快速移动物体的优化CONTROL_SCENE_MODE_BARCODE:用于准确捕获条形码照片的优化CONTROL_SCENE_MODE_BEACH:海滩场景,适合户外、明亮的场景CONTROL_SCENE_MODE_CANDLELIGHT:火焰场景,适合光源为火焰的昏暗场景CONTROL_SCENE_MODE_DISABLED:关闭场景模式CONTROL_SCENE_MODE_FACE_PRIORITY:人脸场景,如果支持人脸检测,使用3A优化数据CONTROL_SCENE_MODE_FIREWORKS:烟火场景,为晚上的烟火优化图片CONTROL_SCENE_MODE_HDR:HDR高动态范围模式,需要更长的时间捕获单个图像CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO:已经废弃,主要用于高速录像场景CONTROL_SCENE_MODE_LANDSCAPE:风景场景,用于优化远距离拍摄图片CONTROL_SCENE_MODE_NIGHT:夜间场景,用于优化低光场景下的图片CONTROL_SCENE_MODE_NIGHT_PORTRAIT:夜间人像,用于优化低光场景下的人像拍摄CONTROL_SCENE_MODE_PARTY:聚会场景,适合昏暗、室内、多个移动人像的场景CONTROL_SCENE_MODE_PORTRAIT:人像场景CONTROL_SCENE_MODE_SNOW:雪景,适合明亮、室外、包含雪的场景CONTROL_SCENE_MODE_SPORTS:运动场景,适合快速移动的人物CONTROL_SCENE_MODE_STEADYPHOTO:优化设备小幅移动导致的图像模糊,比如手抖CONTROL_SCENE_MODE_SUNSET:日落场景CONTROL_SCENE_MODE_THEATRE:剧场场景,适合昏暗、室内、闪光灯关闭的场景 - 录像防抖模式
VIDEO_STABILIZATIONCONTROL_VIDEO_STABILIZATION_MODE_OFF:录像防抖模式关闭CONTROL_VIDEO_STABILIZATION_MODE_ON:录像防抖模式开启 - 失真校准模式
DISTORTION_CORRECTIONDISTORTION_CORRECTION_MODE_FAST:镜头失真校准,在不降低传感器帧率情况下使用镜头失真校准DISTORTION_CORRECTION_MODE_HIGH_QUALITY:高质量失真校准,但是会降低传感器帧率DISTORTION_CORRECTION_MODE_OFF:失真校准模式关闭 - 边缘增强
EDGE_MODEEDGE_MODE_FAST:边缘增强,不降低传感器帧率EDGE_MODE_HIGH_QUALITY:高质量边缘增强,但是会降低传感器帧率EDGE_MODE_OFF:边缘增强关闭EDGE_MODE_ZERO_SHUTTER_LAG:ZSL零延时边缘增强 - 闪光模式
FLASH_MODEFLASH_MODE_OFF:图片捕获时不使用闪光灯FLASH_MODE_SINGLE:如果闪光灯有效并有电,则开启闪光灯FLASH_MODE_TORCH:闪光灯手电筒模式FLASH_STATE_CHARGING:闪光灯正在充电,不能使用FLASH_STATE_FIRED:这次图片捕获时,使用闪光灯FLASH_STATE_PARTIAL:闪光灯部分照亮这帧图片 - 闪光灯状态
FLASH_STATEFLASH_STATE_READY:闪光灯已经准备好闪光FLASH_STATE_UNAVAILABLE:没有闪光灯 - 热点校正
HOT_PIXELHOT_PIXEL_MODE_FAST:传感器的热噪声:热点hot pixel,是因为芯片温度过高产生的噪点。开启热点校正,但不降低传感器帧率HOT_PIXEL_MODE_HIGH_QUALITY:高质量的热点校正,但会降低传感器帧率HOT_PIXEL_MODE_OFF:热点校正关闭 - 相机硬件设备可控级别
SUPPORTED_HARDWARE_LEVEL
各个模式支持的功能级别LEGACY < LIMITED < FULL < LEVEL_3INFO_SUPPORTED_HARDWARE_LEVEL_3:最高权限,全层可控,并且可以进行YUV的再处理和原始数据捕获INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL:摄像头设备为外接设备INFO_SUPPORTED_HARDWARE_LEVEL_FULL:支持对每一帧数据进行控制,还支持高速率的图片拍摄INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED:受限模式,支持一些基本功能;还有部分额外功能(FULL子集)INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY:向后兼容模式 - 镜头人头方向
LENS_FACINGLENS_FACING_BACK:摄像头镜头成像方向与屏幕预览的关系,镜头与屏幕预览方向相反LENS_FACING_EXTERNAL:外置摄像头,镜头与屏幕方向没有关系LENS_FACING_FRONT:镜头与屏幕预览方向相同 - 镜头聚焦距离测量
LENS_INFO_FOCUS_DISTANCE_CALIBRATIONLENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE:镜头焦距以屈光度测量LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED:镜头焦距以屈光度测量并校准LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED:镜头焦距不准确,没有校准过 - 镜头光学防抖
OIS: LENS_OPTICAL_STABILIZATIONLENS_OPTICAL_STABILIZATION_MODE_OFF:镜头光学防抖关闭LENS_OPTICAL_STABILIZATION_MODE_ON:镜头光学防抖开启 - 镜头光学中心位置
LENS_POSE_REFERENCELENS_POSE_REFERENCE_GYROSCOPE:镜头光学中心位置优先使用陀螺仪LENS_POSE_REFERENCE_PRIMARY_CAMERA:镜头光学中心位置与相机相同方向 - 镜头状态
LENS_STATE_MOVING:一个或者几个镜头的参数正在改变LENS_STATE_STATIONARY:镜头参数不会改变 - 多图像传感器的同步
MULTI_CAMERA_SENSOR_SYNCLOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE:软件同步,图像的时间戳来自于传感器开始曝光的近似值LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED:硬件同步,时间戳为准确值 - 降噪模式
NOISE_REDUCTIONNOISE_REDUCTION_MODE_FAST:开启降噪模式,不降低传感器帧率NOISE_REDUCTION_MODE_HIGH_QUALITY:高质量降噪模式,但会降低传感器帧率NOISE_REDUCTION_MODE_MINIMAL:在不降低传感器帧率情况下,将噪声降到最小NOISE_REDUCTION_MODE_OFF:降噪模式关闭NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG:ZSL零延时降噪模式 - 有效请求功能集
REQUEST_AVAILABLE_CAPABILITIESREQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE:向后兼容,每个摄像头设备支持的最小功能集REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE:当后期处理设置为FAST模式时,CameraDevice支持以大于等于 20帧/秒(至少未压缩的YUV格式)的速度捕获高分辨率图像;也可以大于等于 10帧/秒的速度捕获最大分辨率图像。高分辨率至少 800 万像素或设备的最大分辨率,以较小者为准REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO:设备支持高速视频录制(帧率大于等于 120 帧/秒)REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT:支持景深REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA:支持两个或多个物理摄像头REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING:支持图像手动后期处理REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR:支持传感器获取图像阶段的手动控制,比如3A算法控制REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME:单色相机,U, V的值都是 128REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING:支持运动追踪REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING:支持零延时ZSLREQUEST_AVAILABLE_CAPABILITIES_RAW:支持传感器的原始缓冲区数据REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS:3A在运行时,支持读取传感器的设置REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING:和PRIVATE_REPROCESSING类似,支持YUV_420_888 - 裁剪类型
CROPPINGSCALER_CROPPING_TYPE_CENTER_ONLY:仅支持中央裁剪区域SCALER_CROPPING_TYPE_FREEFORM:支持任意选择裁剪区域 - 颜色滤镜
COLOR_FILTERSENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR:颜色滤镜即传感器中Bayer格式图像的RGB滤色器,从左上角开始每个 2x2 的像素区域使用的颜色滤镜组合;当前为BGGRSENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG:2x2 区域为GBRGSENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG:2x2 区域为GRBGSENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB:传感器输出不是Bayer格式的图像,输出的是每个像素 316 位值,而不是 116SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB:2x2 区域为RGGB - 时间戳
TIMESTAMPSENSOR_INFO_TIMESTAMP_SOURCE_REALTIME:时间戳和系统时间相同SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN:时间戳以纳秒为单位,并不能和其他子系统对比 - 光源色温
ILLUMINANTSENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER:指的是人造标准光源的类型,模拟环境光源。模拟多云天SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT:模拟白色荧光,W 3900 - 4500 KSENSOR_REFERENCE_ILLUMINANT1_D50:D50, 5000K模拟太阳光色温SENSOR_REFERENCE_ILLUMINANT1_D55:D55SENSOR_REFERENCE_ILLUMINANT1_D65:D65 6500K国际标准人工日光色温SENSOR_REFERENCE_ILLUMINANT1_D75:D75 75000K模拟北方平均太阳光色温SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT:模拟白天SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT:白天荧光D 5700 - 7100KSENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT:白天白色荧光N 4600 - 5400KSENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER:模拟好天气SENSOR_REFERENCE_ILLUMINANT1_FLASH:闪光灯SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT:荧光灯SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN:标准钨丝灯SENSOR_REFERENCE_ILLUMINANT1_SHADE:阴影SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A:美式橱窗射灯2856KSENSOR_REFERENCE_ILLUMINANT1_STANDARD_B:SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C:SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN:白炽灯SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT:白色荧光灯WW 3200 - 3700K - 测试图案
TEST_PATTERNSENSOR_TEST_PATTERN_MODE_COLOR_BARS:使用 8 条彩色图案:白、黄、青、绿、品红、红、蓝、黑SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY:和COLOR_BARS类似,但是从顶部到底部淡化成灰色SENSOR_TEST_PATTERN_MODE_CUSTOM1:自定义模式,图片必须是静态的SENSOR_TEST_PATTERN_MODE_OFF:默认值,没有使用测试图案,直接返回传感器捕获的数据SENSOR_TEST_PATTERN_MODE_PN9:所有像素数据由从PN9 512位序列生成的伪随机序列SENSOR_TEST_PATTERN_MODE_SOLID_COLOR:所有像素由颜色通道代替 - 镜头阴影校正
Lens SHADINGSHADING_MODE_FAST:镜头均匀性指画面中心的明亮度到四周的明亮度比值。阴影校正,不会降低传感器帧率SHADING_MODE_HIGH_QUALITY:高质量的阴影校正,但会降低帧率SHADING_MODE_OFF:没有校正 - 人脸检测
FACE DETECTSTATISTICS_FACE_DETECT_MODE_FULL:返回人脸检测所有元数据:面部矩形,分数,ID等STATISTICS_FACE_DETECT_MODE_OFF:人脸检测统计数据关闭STATISTICS_FACE_DETECT_MODE_SIMPLE:仅返回人脸矩形,置信度 - 镜头均匀性阴影图
LENS SHADING MAPSTATISTICS_LENS_SHADING_MAP_MODE_OFF:传感器输出的数据中不包含镜头阴影图STATISTICS_LENS_SHADING_MAP_MODE_ON:传感器输出的数据中包含镜头阴影图 - 光学防抖数据
OIS DATASTATISTICS_OIS_DATA_MODE_OFF:传感器输出数据不包含光学防抖位置信息STATISTICS_OIS_DATA_MODE_ON:传感器输出数据包含光学防抖位置信息 - 照明闪烁
FLICKERSTATISTICS_SCENE_FLICKER_50HZ:CameraDevice检查当前场景照明闪烁50HZSTATISTICS_SCENE_FLICKER_60HZ:闪烁为60HZSTATISTICS_SCENE_FLICKER_NONE:不去检查 - 最大延迟同步
LATENCYSYNC_MAX_LATENCY_PER_FRAME_CONTROL:每帧都去检查最大延迟同步SYNC_MAX_LATENCY_UNKNOWN:不确定延迟同步 - 色调映射模式
TONEMAP MODETONEMAP_MODE_CONTRAST_CURVE:不会降低传感器帧率,使用指定色调映射曲线TONEMAP_MODE_FAST:不会降低传感器帧率,使用高级伽马映射和颜色增强TONEMAP_MODE_GAMMA_VALUE:不会降低帧率,使用伽马值进行颜色映射,禁用其他色调映射和颜色增强TONEMAP_MODE_HIGH_QUALITY:高质量的伽马映射和颜色增强,会降低帧率TONEMAP_MODE_PRESET_CURVE:不会降低帧率,使用预设的色调映射曲线来执行色调映射,禁用其他色调映射和颜色增强 - 色调映射曲线预设值
TONEMAP PRESET CURVETONEMAP_PRESET_CURVE_REC709:色调映射曲线预设ITU-R BT.709TONEMAP_PRESET_CURVE_SRGB:色调映射曲线预设sRGB
CameraCharacteristics
继承 CameraMetadata ,用来描述 CameraDevice 设备的属性,这些属性是不可修改的,设备出厂时提供的;可以通过 CameraManager.getCameraCharacteristics(String cameraID) 来查询当前设备支持哪些属性。
Key 常量
CameraCharacteristics 支持的 Key 常量及对应含义,这些值都是从 system/media/camera/docs 中自动解析生成的:
1 | // 相差矫正模式列表 |
API 方法
CameraCharacteristics 支持的方法:
1 | public final class CameraCharacteristics |
CaptureRequest
CaptureRequest 继承了 CameraMetadata ;表示从 CameraDevice 获取捕获数据的请求,包含对 CameraDevice 的参数设置,算法控制,输出缓冲区等等。
- 创建实例
由CameraDevice.createCaptureRequest返回的CaptureRequest.Builder来创建实例。 - 请求
由CameraCaptureSession.capture, CameraCaptureSession.setRepeatingRequest向CameraDevice发出请求。
Key 常量
CaptureRequest 支持的 Key 常量及其含义,这些值都是 system/media/camera/docs 自动生成的:
1 | // 黑电平补偿是否锁定当前值;对于某些参数(曝光时间)的改变需要重置黑电平 |
API 方法
CaptureRequest 中 API 简介:
1 | public final class CaptureRequest |
Builder 内部类
CaptureRequest.Builder 内部类,建造者模式,用于创建 CaptureRequest 实例。
1 | public final static class Builder { |
Key 内部类
CaptureRequest.Key<T> 内部类,用于设置参数时的 Key 值。
1 | public final static class Key<T> { |
CaptureResult
CaptureResult 继承了 CameraMetadata ;表示从 CameraDevice 获取到数据的结果子集;包含捕获硬件(传感器,镜头,闪存),控制算法和输出缓冲区的最终配置等的子集;CaptureResult 对象实例是不可变的。
Key 常量
通过对比代码 CaptureRequest, CaptureResult 两份代码大部分都相同,特别是 Key 常量的定义(都是在 system/media/camera/docs 中通过脚本生成),CaptureResult 仅仅是新增了几个常量:
1 | ... |
API 方法
CaptureResult 中 API 简介:
1 | public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { |
CaptureResult.Key 和 CaptureRequest.Key 代码几乎一样,主要是提供一个 Key 封装。
TotalCaptureResult
TotalCaptureResult 继承了 CaptureResult ;表示传感器捕获的单个图像组成的结果集合。在 CaptureCallback.onCaptureCompleted 回调后,会返回 TotalCaptureResult 总的捕获结果集合。部分源码如下:
1 | public final class TotalCaptureResult extends CaptureResult { |
DngCreator
DngCreator 用于将传感器捕获到的原始图像数据转换为 DNG 格式图片,图片相关处理的方法都是 native 的。
1 | public final class DngCreator implements AutoCloseable { |
示例
TextureView 输出显示
通过 TextureView 来显示捕获的数据;需要监听 TextureView.SurfaceTextureListener ,当输出 onSurfaceTextureAvailable 可用时,才能向 CameraDevice 请求数据输出。
1 | private TextureView mTextureView; |
获取 CameraManager
1 | mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); |
获取后置摄像头 ID 及支持级别
通过 CameraCharacteristics 了解设备的属性。
1 | for (String cameraId : mCameraManager.getCameraIdList()) { |
打开 CameraDevice 并设置状态监听
打开 CameraDevice 时设置状态监听;在设备正确打开后,在 CameraDevice.StateCallback.onOpened 中创建 CameraCaptureSession 会话。
1 | CameraDevice.StateCallback mCameraDeviceStateCallback = |
初始化输出 Surface
本示例中有两个 Surface :
TextureView对应Surface:预览时用于实时输出ImageReader对应Surface:拍照时用于保存图片
1 | SurfaceTexture texture = mTextureView.getSurfaceTexture(); |
创建会话 CameraCaptureSession
通过 mCameraDevice.createCaptureSession 创建会话成功后,在回调方法 CameraCaptureSession.StateCallback.onConfigured 中获取会话 mCameraCaptureSession ,后续所有的 CaptureRequest 都是通过该会话发起。
可以在创建会话成功时,同步开启预览请求 preview 。
1 | private void createCameraCaptureSession() { |
发出预览请求 CaptureRequest
预览请求为 CameraDevice.TEMPLATE_PREVIEW ,设置输出为 mTextureSurface ,当捕获到预览数据时,会反复响应 CameraCaptureSession.CaptureCallback :
1 | private void preview(){ |
发出拍照请求 CaptureRequest
拍照请求为 CameraDevice.TEMPLATE_STILL_CAPTURE ,设置输出为 mImageReader.getSurface() ,当存在有效数据时直接触发 ImageReader.OnImageAvailableListener 。
1 | private void takePicture(){ |
这里需要注意的是,拍照前需要根据传感器安装的方向和屏幕旋转角度来配置图片保存方向,否则可能会出现横竖混淆的照片:

获取
Camera sensor安装方向1
2mSensorOrientation =
characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);获取当前屏幕的旋转角度
1
2int displayRotation = activity.getWindowManager()
.getDefaultDisplay().getRotation();
如果安装方向和旋转角度一致(比如都是 90° ),则不需要补偿;否则需要按照顺时针方向设置旋转(即屏幕顺时针朝着 sensor 方向旋转角度),参考 Camera.java 中 setDisplayOrientation 方法的代码注释,计算公式如下:
1 | // 获取当前摄像头是前置还是后置 |
我们以后摄为例,屏幕旋转方向和 Camera sensor 安装方向可能出现的如下几种组合:

补偿角度的计算结果按照公式如下,先以 Sensor 方向不变:
1 | 0: (0 - 0 + 360) % 360 = 0 180: (180 - 0 + 360) % 360 = 180 |
当 Sensor 安装方向为 0 时,如果屏幕旋转角度也为 0 ,则两个是同方向的,不需要补偿(补偿为 0);当 Sensor 安装方向为 180 时,如果屏幕旋转角度为 90 (向右横屏),则需要补偿 90 (即当前屏幕方向朝 Sensor 方向旋转 90 度)。
小结
- 需要等待
TextureView可用后,才能开启预览 - 图片保存时,需要设置方向,否则可能会出现旋转角度
序列图

小结
CameraMetadata 及其子类的 Key 值
CameraMetadata, CaptureRequest, CaptureResult, CameraCharacteristics 的几个常量都是 system/media/camera/docs 中脚本自动生成的,在 metadata_properties.xml 中定义,解析时的对应关系为:
1 | ## Static properties only |
CameraCaptureSession 的两个重要方法
setRepeatingRequest:用于预览capture:用于拍照