Android 相机参数的获取和设置主要通过 Camera API(旧版)和 Camera2 API(新版,强烈推荐)来完成,下面我将围绕这两个 API,并结合具体参数进行讲解。

(图片来源网络,侵删)
核心概念:参数的层次结构
在深入具体参数之前,你需要理解 Android 相机参数的组织方式,它通常是一个分层的结构:
- 设备:代表物理相机硬件(如后置主摄、前置广角、后置长焦等)。
- 会话:
CameraCaptureSession,管理与相机的连接,用于发送请求和接收结果。 - 请求:
CaptureRequest,这是最重要的部分,它包含了“在某一时刻,你希望相机做什么”的所有参数,对焦模式、曝光模式、拍照还是录像、是否开启闪光灯等。 - 配置:
CameraCharacteristics,代表相机硬件的“静态能力”,这些是相机本身固有的属性,你不能改变它们,只能查询,支持哪些分辨率、支持哪些对焦模式、传感器尺寸是多少等。
简单比喻:
CameraCharacteristics就像一辆汽车的《说明书》,告诉你这辆车有哪些功能(比如最高时速、有几个档位、有没有ESP)。CaptureRequest就像你踩下油门、转动方向盘、挂上档位的动作,你告诉车在当前状态下要怎么做。CameraCaptureSession就像你和汽车之间的通信协议,确保你的动作被正确执行。
核心参数详解
我们将参数分为两大类:静态能力 和 动态请求。
A. 静态能力 - CameraCharacteristics
这些参数通过 CameraCharacteristics.get(key) 获取,用于了解相机的能力。

(图片来源网络,侵删)
| 参数 Key | 说明 | 常用值/类型 | 用途 |
|---|---|---|---|
LENS_FACING |
相机朝向 | LENS_FACING_BACK, LENS_FACING_FRONT |
区分前置、后置、外置相机。 |
SENSOR_INFO_PIXEL_ARRAY_SIZE |
传感器分辨率 | Size(width, height) |
获取相机传感器的原始分辨率,是计算其他预览/拍照尺寸的基础。 |
SCALER_AVAILABLE_STREAM_CONFIGURATIONS |
支持的输出流配置 | StreamConfigurationMap |
非常重要! 获取所有支持的输出格式(如 ImageFormat.YUV_420_888, ImageFormat.JPEG)和对应的分辨率(Size数组),用于设置预览尺寸、拍照尺寸等。 |
CONTROL_AF_AVAILABLE_MODES |
支持的对焦模式 | int[] 数组,如 [CONTROL_AF_MODE_AUTO, CONTROL_AF_MODE_CONTINUOUS_PICTURE] |
查询相机支持哪些对焦方式。 |
CONTROL_AE_AVAILABLE_MODES |
支持的曝光模式 | int[] 数组,如 [CONTROL_AE_MODE_ON_AUTO_FLASH, CONTROL_AE_MODE_OFF] |
查询相机支持哪些曝光方式。 |
FLASH_INFO_AVAILABLE |
是否支持闪光灯 | boolean |
判断设备是否有闪光灯。 |
LENS_INFO_AVAILABLE_FOCAL_LENGTHS |
可用焦距 | float[] |
获取镜头的焦距信息,可用于计算视场角。 |
STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES |
支持的人脸检测模式 | int[] |
查询是否支持以及支持哪种级别的人脸检测。 |
CONTROL_AVAILABLE_EFFECTS |
支持的拍照特效 | int[],如 [EFFECT_NONE, EFFECT_MONO, EFFECT_NEGATIVE] |
查询可用的艺术滤镜。 |
B. 动态请求 - CaptureRequest
这些参数设置在 CaptureRequest.Builder 中,用于控制相机在某一帧的行为。
| 参数 Key | 说明 | 常用值/类型 | 用途 |
|---|---|---|---|
CONTROL_AF_MODE |
对焦模式 | CONTROL_AF_MODE_OFF (手动)CONTROL_AF_MODE_AUTO (自动对焦,触发一次)CONTROL_AF_MODE_CONTINUOUS_PICTURE (连续对焦,适合拍照)CONTROL_AF_MODE_CONTINUOUS_VIDEO (连续对焦,适合视频) |
拍照时通常用 CONTINUOUS_PICTURE 或 AUTO,视频时用 CONTINUOUS_VIDEO。 |
CONTROL_AF_TRIGGER |
对焦触发 | CONTROL_AF_TRIGGER_START (开始对焦)CONTROL_AF_TRIGGER_CANCEL (取消对焦) |
当 CONTROL_AF_MODE 设置为 AUTO 时,需要发送 START 来触发一次对焦,对焦完成后,会通过 CameraCaptureSession.CaptureCallback 通知你。 |
CONTROL_AE_MODE |
曝光模式 | CONTROL_AE_MODE_ON_AUTO_FLASH (自动闪光)CONTROL_AE_MODE_ON_ALWAYS_FLASH (强制闪光)CONTROL_AE_MODE_OFF (关闭自动曝光,需手动设置曝光补偿) |
控制是否启用自动曝光和闪光灯。 |
CONTROL_AE_EXPOSURE_COMPENSATION |
曝光补偿 | int 值,范围由 CameraCharacteristics 决定 |
调整画面的明暗,正值变亮,负值变暗。 |
CONTROL_AE_PRECAPTURE_TRIGGER |
拍照触发(测光) | CONTROL_AE_PRECAPTURE_TRIGGER_START |
在拍照前发送此请求,让相机进行测光、对焦、白平衡等准备工作,以确保最佳成像质量。 |
CONTROL_AE_LOCK |
曝光锁定 | true / false |
锁定当前曝光值,之后即使场景变化,亮度也不会变。 |
CONTROL_AWB_MODE |
白平衡模式 | CONTROL_AWB_MODE_AUTO (自动)CONTROL_AWB_MODE_CLOUDY_DAYLIGHT (阴天)CONTROL_AWB_MODE_TUNGSTEN (白炽灯) |
控制画面的色彩还原。 |
FLASH_MODE |
闪光灯模式 | FLASH_MODE_OFF (关闭)FLASH_MODE_SINGLE (自动/闪光一次)FLASH_MODE_TORCH (手电筒模式,常亮) |
单独控制闪光灯,注意与 CONTROL_AE_MODE 的联动。 |
CONTROL_EFFECT_MODE |
特效模式 | EFFECT_NONE, EFFECT_MONO, EFFECT_SEPIA 等 |
应用黑白、复古等滤镜效果。 |
CONTROL_ZOOM_RATIO |
数码变焦 | float 值 (1.0 为原始) |
实现数码变焦,注意变焦会降低画质。 |
JPEG_ORIENTATION |
JPEG图片方向 | int (0, 90, 180, 270) |
非常重要! 拍照的JPEG图片需要根据设备方向进行旋转,才能在相册中正确显示,需要结合设备方向和相机传感器方向计算。 |
SENSOR_ORIENTATION |
传感器方向 | int (0, 90, 270) |
相机传感器的物理方向,用于计算正确的图片旋转角度。 |
STATISTICS_FACE_DETECT_MODE |
人脸检测模式 | STATISTICS_FACE_DETECT_MODE_FULL |
启用人脸检测功能。 |
代码示例 (Camera2 API)
下面是一个使用 Camera2 API 设置核心参数的简化示例。
获取静态能力
// 在相机打开后,获取 CameraCharacteristics
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = manager.getCameraIdList()[0]; // 假设使用后置摄像头
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
// 查询支持的对焦模式
int[] afModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
if (Arrays.asList(afModes).contains(CameraCharacteristics.CONTROL_AF_MODE_CONTINUOUS_PICTURE)) {
// 支持连续对焦模式,适合拍照
}
// 查询支持的预览尺寸
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
Size[] previewSizes = map.getOutputSizes(SurfaceTexture.class);
// 从 previewSizes 中选择一个合适的尺寸...
创建动态请求
// 创建 CaptureRequest.Builder
// 第一个参数是目标 Surface,第二个参数是模板类型(预览、拍照等)
CaptureRequest.Builder previewRequestBuilder =
cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 1. 设置目标 Surface (预览画面将显示在这个 Surface 上)
previewRequestBuilder.addTarget(surface);
// 2. 设置对焦模式
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 3. 设置曝光模式 (自动闪光)
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// 4. 设置白平衡模式
previewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE,
CaptureRequest.CONTROL_AWB_MODE_AUTO);
// 5. 如果需要锁定对焦或曝光
// previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
// previewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
// 6. 构建最终的 CaptureRequest
CaptureRequest previewRequest = previewRequestBuilder.build();
// 7. 将请求发送到 CameraCaptureSession
cameraCaptureSession.setRepeatingRequest(previewRequest, null, null);
拍照时的特殊请求
拍照通常需要两步:测光 和 捕获。
// 第一步:发送测光请求
CaptureRequest.Builder stillCaptureBuilder =
cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
// ... 设置和预览请求相同的参数 (对焦、曝光等)
// 发送预捕获触发,让相机进行准备工作
stillCaptureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
// 第二步:在收到测光完成的回调后,发送拍照请求
// 在 CameraCaptureSession.CaptureCallback 的 onCaptureProgressed 中
// 检查 CaptureResult.CONTROL_AE_STATE 是否为 CONTROL_AE_STATE_CONVERGED
// 如果已收敛,则执行拍照
// 创建拍照请求
stillCaptureBuilder.addTarget(imageReader.getSurface());
// ... 可以在这里设置 JPEG 方向
// int rotation = getWindowManager().getDefaultDisplay().getRotation();
// stillCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getCorrectOrientation(rotation, characteristics));
CaptureRequest captureRequest = stillCaptureBuilder.build();
cameraCaptureSession.capture(captureRequest, captureCallback, backgroundHandler);
重要注意事项
-
API 版本:
(图片来源网络,侵删)Camera(1.0) API:已废弃,仅用于维护旧项目。Camera2(API 21+):现代 Android 开发的唯一选择,功能强大,但使用复杂,Google 提供了 CameraX 库来简化 Camera2 API 的使用。
-
性能:
Camera2是异步的,所有操作(打开相机、设置参数、拍照)都必须通过回调函数处理。- 频繁地设置
CaptureRequest参数(尤其是在预览时)可能会影响性能,一旦设置好预览参数,就使用setRepeatingRequest来持续渲染预览画面。
-
权限:
- 从 Android 6.0 (API 23) 开始,相机访问需要运行时权限
Manifest.permission.CAMERA。 - 如果你的 App 录音,还需要
Manifest.permission.RECORD_AUDIO。
- 从 Android 6.0 (API 23) 开始,相机访问需要运行时权限
-
线程:
- 所有与相机相关的回调(
CameraDevice.StateCallback,CameraCaptureSession.CaptureCallback)都会在后台线程执行,不要在这些回调中进行耗时操作(如 UI 更新),应使用Handler将任务切换到主线程。
- 所有与相机相关的回调(
掌握 Android 相机参数,关键在于理解 CameraCharacteristics(能力)和 CaptureRequest(指令)的区别,通过查询 Characteristics 来了解相机能做什么,然后通过构建 Request 来告诉相机具体怎么做,在实践中,多查阅官方文档,并结合代码进行调试,是掌握这些参数的最佳途径。
