Android 相机系统非常灵活,但同时也比较复杂,参数可以分为几个层面:

- Camera2 API (推荐): 这是现代 Android (API Level 21+) 的官方推荐相机 API,功能强大,控制粒度细,是专业相机应用开发的基础。
- CameraX (推荐): 这是一个 Jetpack 库,它封装了复杂的 Camera2 API,并提供了兼容性支持(回退到 Camera1),大大简化了开发,它基于 Camera2,所以参数本质上是相通的。
- Camera1 API (已废弃): 旧版 API,控制能力有限,不推荐新项目使用,但可能在维护旧应用时遇到。
下面我将主要围绕 Camera2 API 来详细介绍参数,并说明如何在 CameraX 中使用它们。
核心参数分类
我们可以将相机参数想象成一个物理相机的各种旋钮和设置,它们主要分为以下几类:
曝光相关参数
控制进光量,决定照片的亮度。
| 参数 | 对应物理概念 | 控制方法 | 作用 |
|---|---|---|---|
| ISO | 感光度 | CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE |
数值越高,感光能力越强,但画面噪点也越多,通常有自动和手动范围。 |
| Shutter Speed (曝光时间) | 快门速度 | CameraCaptureSettings.exposureTime |
传感器曝光的时间,时间越长,进光量越多,画面越亮,但时间过长可能导致运动模糊。 |
| Aperture (光圈) | 光圈值 (f-stop) | CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES |
镜头孔径的大小,f值越小(如 f/1.8),光圈越大,进光量越多,背景虚化效果也越明显。 |
| AE (Auto-Exposure) | 自动曝光 | CaptureRequest.CONTROL_AE_MODE |
控制相机是否自动调整曝光参数,常用值有 ON_AUTO, ON_ALWAYS_FLASH, OFF (手动) 等。 |
| AEC (AE Lock) | 曝光锁定 | CaptureRequest.CONTROL_AE_LOCK |
锁定当前曝光值,防止后续预览或拍摄时亮度突然变化。 |
对焦相关参数
控制相机的清晰度。

| 参数 | 对应物理概念 | 控制方法 | 作用 |
|---|---|---|---|
| AF Mode (对焦模式) | 对焦模式 | CaptureRequest.CONTROL_AF_MODE |
设置对焦方式。AUTO (自动连续对焦), MACRO (微距), CONTINUOUS_PICTURE (拍照时连续对焦), CONTINUOUS_VIDEO (视频时连续对焦), LOCKED (手动锁定)。 |
| AF Regions (对焦区域) | 对焦框 | CaptureRequest.CONTROL_AF_REGIONS |
定义一个或多个矩形区域,让相机优先对该区域进行对焦。 |
| AF Trigger | 对焦触发 | CaptureRequest.CONTROL_AF_TRIGGER |
手动触发对焦,常用值有 START (开始对焦), CANCEL (取消对焦)。 |
| AFC (AF Lock) | 对焦锁定 | CaptureRequest.CONTROL_AF_LOCK |
锁定当前对焦距离,防止焦点漂移。 |
白平衡相关参数
控制画面的色彩,使其在不同光源下看起来真实。
| 参数 | 对应物理概念 | 控制方法 | 作用 |
|---|---|---|---|
| AWB Mode (白平衡模式) | 白平衡模式 | CaptureRequest.CONTROL_AWB_MODE |
设置白平衡算法。AUTO (自动), INCANDESCENT (白炽灯), FLUORESCENT (荧光灯), DAYLIGHT (日光), CLOUDY_DAYLIGHT (阴天), LOCKED (手动锁定)。 |
| AWB Regions (白平衡区域) | 白平衡区域 | CaptureRequest.CONTROL_AWB_REGIONS |
定义相机在计算白平衡时参考的区域。 |
| AWB Lock | 白平衡锁定 | CaptureRequest.CONTROL_AWB_LOCK |
锁定当前白平衡设置。 |
闪光灯与测光相关参数
| 参数 | 对应物理概念 | 控制方法 | 作用 |
|---|---|---|---|
| Flash Mode | 闪光灯模式 | CaptureRequest.FLASH_MODE |
OFF, ON, AUTO, TORCH (常亮手电筒)。 |
| AEC (AE Regions) | 测光区域 | CaptureRequest.CONTROL_AE_REGIONS |
定义相机在计算自动曝光时参考的区域,通常和对焦区域配合使用。 |
图像输出与格式相关参数
| 参数 | 对应物理概念 | 控制方法 | 作用 |
|---|---|---|---|
| Preview Size | 预览尺寸 | CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getOutputSizes(SurfaceTexture.class) |
设置预览画面的宽度和高度。 |
| Picture Size | 照片尺寸 | CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getOutputSizes(ImageFormat.JPEG) |
设置拍摄照片的分辨率。 |
| Video Size | 视频尺寸 | CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP.getOutputSizes(MediaRecorder.class) |
设置录制视频的分辨率。 |
| Image Format | 图像格式 | ImageFormat.JPEG, ImageFormat.YUV_420_888, ImageFormat.RAW_SENSOR |
JPEG 为压缩格式,用于存储;YUV 用于处理(如人脸检测);RAW 为原始数据,用于专业后期。 |
拍摄控制参数
| 参数 | 对应物理概念 | 控制方法 | 作用 |
|---|---|---|---|
| Scene Mode | 场景模式 | CaptureRequest.CONTROL_SCENE_MODE |
自动优化一组参数以适应特定场景,如 PORTRAIT (人像), LANDSCAPE (风景), NIGHT (夜景), NIGHT_PORTRAIT (夜景人像)。 |
| Effect Mode | 特效模式 | CaptureRequest.CONTROL_EFFECT_MODE |
为画面添加特殊效果,如 MONO (黑白), SEPIA (棕褐色), NEGATIVE (底片)。 |
| Stabilization | 防抖 | CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE |
OFF, ON (光学防抖),可以显著提高在运动或暗光下手持拍摄的清晰度。 |
| Lens Facing | 摄像头朝向 | CameraCharacteristics.LENS_FACING |
FRONT (前置), BACK (后置), EXTERNAL (外置),用于选择使用哪个摄像头。 |
如何在 Camera2 API 中使用这些参数
使用 Camera2 API 的标准流程是 打开相机 -> 配置输出 -> 捕捉图像 -> 关闭相机。
获取相机参数
你需要获取 CameraCharacteristics 对象,它包含了相机硬件的静态信息(只读)。
// 打开相机 CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); String cameraId = manager.getCameraIdList()[0]; // 获取后置摄像头ID CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); // 获取支持的参数范围 Range<Integer> isoRange = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE); Range<Long> exposureTimeRange = characteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE); float[] apertures = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES);
配置并设置参数
创建一个 CaptureRequest.Builder,然后通过 set() 方法设置你想要的参数。

// 创建一个用于拍照的CaptureRequest.Builder
CameraCaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
// --- 设置参数 ---
// 1. 曝光
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
captureRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, 800); // 设置ISO为800
captureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 1000000L / 30); // 设置快门为1/30秒
// 2. 对焦
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 设置对焦区域 (一个矩形区域,归一化坐标 0.0f - 1.0f)
Rect afRegion = new Rect(100, 100, 300, 300); // 示例区域
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, new MeteringRectangle[]{new MeteringRectangle(afRegion, MeteringRectangle.METERING_WEIGHT_MAX)});
// 3. 白平衡
captureRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_CLOUDY_DAYLIGHT);
// 4. 闪光灯
captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_AUTO);
// 5. 图像旋转 (非常重要!)
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int sensorOrientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
int jpegOrientation = (sensorOrientation + rotation * 90) % 360;
captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, jpegOrientation);
// 6. 将预览Surface加入请求
captureRequestBuilder.addTarget(surface);
// 构建最终的CaptureRequest
CaptureRequest captureRequest = captureRequestBuilder.build();
执行捕获
将配置好的 CaptureRequest 发送给相机设备进行拍照。
// cameraDevice是之前打开的CameraDevice实例 // captureSession是之前创建的CameraCaptureSession实例 cameraCaptureSession.capture(captureRequest, null, null);
如何在 CameraX 中使用这些参数
CameraX 的设计哲学是“声明式”的,你通过构建器 Preview.Builder, ImageCapture.Builder 等来声明你想要什么,而不是去操作底层的 CaptureRequest。
基础设置
// 1. 定义UseCase
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
// 2. 绑定到生命周期
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, imageCapture)
}, ContextCompat.getMainExecutor(context))
// 3. 将Preview连接到PreviewView
preview.setSurfaceProvider(previewView.surfaceProvider)
设置 ImageCapture 参数
ImageCapture.Builder 提供了链式调用来配置参数,这些参数最终会映射到底层的 Camera2 参数。
val imageCapture = ImageCapture.Builder()
// 设置捕捉模式 (单张/HDR)
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) // 或 CAPTURE_MODE_MAXIMIZE_QUALITY
// 设置闪光灯模式
.setFlashMode(ImageCapture.FLASH_MODE_AUTO) // FLASH_MODE_ON, FLASH_MODE_OFF, FLASH_MODE_SCREEN
// 设置图像分析器 (可选)
.setAnalyzer(Executors.newSingleThreadExecutor(), imageAnalyzer)
// 设置拍照时的缩放比例
.setZoomRatio(1.5f)
// 设置目标旋转
.setTargetRotation(previewView.display.rotation)
// 设置拍照质量/分辨率
.setTargetResolution(Size(4032, 3024)) // 设置目标尺寸,CameraX会自动选择最接近的
.build()
动态修改参数 (对焦、曝光)
对于需要动态调整的参数(如点击对焦),CameraX 提供了 CameraControl。
// 从 Preview 或 ImageCapture 获取 CameraControl
val cameraControl = previewView.cameraControl
// 在 PreviewView 上点击时,进行对焦
previewView.setOnTouchListener { view, event ->
if (event.action == MotionEvent.ACTION_UP) {
val meteringPointFactory = PreviewViewMeteringPointFactory(view)
val action = FocusMeteringAction.Builder(meteringPointFactory.createPoint(event.x, event.y)).build()
// 执行对焦和测光操作
cameraControl.startFocusAndMetering(action)
.addListener({
// 对焦成功
}, ContextCompat.getMainExecutor(context))
}
true
}
CameraX 的 FocusMeteringAction 会自动帮你设置 CONTROL_AF_MODE, CONTROL_AF_REGIONS, CONTROL_AE_REGIONS 等复杂的 Camera2 参数,非常方便。
重要注意事项
- 异步操作: Camera2 API 几乎所有核心操作都是异步的(打开相机、创建会话、捕获图像等),必须使用
CameraDevice.StateCallback,CameraCaptureSession.CaptureCallback等回调来处理结果。 - 生命周期管理: 必须正确管理相机的生命周期,在 Activity/Fragment 的
onResume中打开相机,在onPause中关闭,CameraX 通过bindToLifecycle自动处理了这一点,极大简化了开发。 - 线程: 相机操作必须在后台线程执行,但结果需要返回到主线程更新 UI,Camera2 需要手动处理线程切换,CameraX 则在内部封装好了。
- 性能: 高分辨率预览、连续对焦、人脸检测等操作会消耗大量 CPU/GPU 资源,要注意性能优化,避免内存泄漏和 ANR。
- 权限: 从 Android 6.0 (API 23) 开始,必须动态申请
CAMERA和WRITE_EXTERNAL_STORAGE(如果需要保存照片) 权限。
| 特性 | Camera2 API | CameraX |
|---|---|---|
| 定位 | 底层、强大、灵活 | 高层、简化、抽象 |
| 控制粒度 | 非常细,直接操作 CaptureRequest |
通过 Builder 和 CameraControl 间接控制 |
| 代码复杂度 | 高,需要处理异步、线程、生命周期 | 低,声明式API,自动处理生命周期 |
| 兼容性 | API 21+ | 通过 Camera2 和 Camera1 支持 API 14+ |
| 适用场景 | 专业相机应用、需要极致控制 | 大多数应用、快速开发 |
对于新项目,强烈推荐使用 CameraX,它能让你专注于业务逻辑而不是复杂的相机细节,如果你需要 CameraX 没有提供的某些特殊功能,你仍然可以通过 Camera2Extender 来访问底层的 Camera2 API。
