
1. Android Camera2 API核心架构解析在移动影像开发领域Camera2 API的出现彻底改变了Android相机应用的开发方式。相比已弃用的Camera APICamera2提供了更精细的控制能力和更高的性能上限。这套API的核心设计理念是将相机设备抽象为流水线Pipeline开发者可以精确控制图像数据的捕获、处理和输出流程。Camera2 API的核心组件包括CameraManager系统的相机服务入口用于枚举和连接相机设备CameraDevice代表物理相机设备的抽象用于创建捕获会话CameraCaptureSession管理图像捕获请求和输出的会话上下文CaptureRequest定义单次图像捕获的参数配置CaptureResult返回捕获操作的元数据结果ImageReader获取图像数据的接口这套架构最显著的特点是采用了请求-响应模型。开发者构建CaptureRequest来配置拍摄参数系统通过CameraCaptureSession提交请求最终在ImageReader和CaptureResult中获取图像数据和元数据。这种设计使得并行处理多个图像流成为可能也为高级功能如连拍、HDR等奠定了基础。2. Camera2核心数据流程拆解2.1 图像数据与元数据分离设计Camera2 API将影像数据明确分为两类Frame数据实际的图像像素数据通常以YUV、JPEG或RAW格式存在Metadata描述图像特征的元数据包括曝光参数、对焦状态、时间戳等这种分离设计带来了几个关键优势可以独立处理图像数据和其描述信息元数据可以用于后期处理决策如选择最佳连拍帧减少不必要的数据拷贝提升性能典型的元数据结构包含{ android.sensor.exposureTime: 10000000, android.lens.focusDistance: 0.5, android.sensor.sensitivity: 400, android.statistics.faces: [...] }2.2 图像流配置与管理Camera2通过Surface对象管理图像流支持同时输出多个不同格式/分辨率的流。常见的流配置模式包括流类型典型用途性能影响PREVIEW取景器显示低延迟要求JPEG静态照片高画质要求RAW专业拍摄大数据量YUV视频/分析平衡型配置多流时需要注意// 典型的三流配置示例 Surface previewSurface new Surface(textureView.getSurfaceTexture()); ImageReader jpegReader ImageReader.newInstance(width, height, ImageFormat.JPEG, 2); ImageReader yuvReader ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 3); ListSurface outputSurfaces Arrays.asList(previewSurface, jpegReader.getSurface(), yuvReader.getSurface());重要提示同时开启的流越多系统负载越高。实际开发中需要根据设备能力动态调整流配置。3. Camera2完整工作流程实现3.1 初始化阶段关键步骤相机权限检查uses-permission android:nameandroid.permission.CAMERA / uses-feature android:nameandroid.hardware.camera /获取CameraManager实例CameraManager manager (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);枚举相机设备特性String[] cameraIds manager.getCameraIdList(); CameraCharacteristics characteristics manager.getCameraCharacteristics(cameraId); // 查询支持的流配置 StreamConfigurationMap map characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);3.2 会话建立与请求处理创建捕获会话的标准流程// 1. 创建CameraDevice.StateCallback CameraDevice.StateCallback stateCallback new CameraDevice.StateCallback() { Override public void onOpened(NonNull CameraDevice camera) { // 设备就绪后创建会话 camera.createCaptureSession(outputSurfaces, sessionCallback, null); } //...其他回调方法 }; // 2. 打开相机设备 manager.openCamera(cameraId, stateCallback, null); // 3. 实现CameraCaptureSession.StateCallback CameraCaptureSession.StateCallback sessionCallback new CameraCaptureSession.StateCallback() { Override public void onConfigured(NonNull CameraCaptureSession session) { // 会话就绪后可以开始发送请求 CaptureRequest.Builder builder device.createCaptureRequest( CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(previewSurface); session.setRepeatingRequest(builder.build(), null, null); } };3.3 高级捕获控制技巧手动曝光控制// 获取相机支持的范围 RangeLong exposureRange characteristics.get( CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE); // 在CaptureRequest中设置 builder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, desiredExposureTime);连拍模式实现// 创建连拍请求队列 ListCaptureRequest burstList new ArrayList(); for (int i 0; i 5; i) { CaptureRequest.Builder builder device.createCaptureRequest( CameraDevice.TEMPLATE_STILL_CAPTURE); builder.addTarget(jpegSurface); burstList.add(builder.build()); } // 提交连拍请求 session.captureBurst(burstList, null, null);4. 性能优化与疑难排查4.1 常见性能瓶颈分析延迟问题排查表症状可能原因解决方案取景器卡顿预览分辨率过高降低PREVIEW流分辨率拍照响应慢JPEG处理耗时使用YUV流后台处理连拍速度低缓冲区不足增加ImageReader缓冲区数量内存优化技巧// 合理设置ImageReader缓冲区数量 ImageReader reader ImageReader.newInstance( width, height, format, /*maxImages*/ 3); // 通常2-4个为宜 // 及时关闭不再使用的Image try (Image image reader.acquireNextImage()) { // 处理图像 } // 自动关闭4.2 典型错误处理CameraAccessException处理try { manager.openCamera(cameraId, callback, null); } catch (CameraAccessException e) { if (e.getMessage().contains(CAMERA_IN_USE)) { // 处理相机被占用情况 } else if (e.getMessage().contains(MAX_CAMERAS_IN_USE)) { // 处理相机数量限制 } }捕获失败监控CameraCaptureSession.CaptureCallback captureCallback new CameraCaptureSession.CaptureCallback() { Override public void onCaptureFailed(NonNull CameraCaptureSession session, NonNull CaptureRequest request, NonNull CaptureFailure failure) { // 分析失败原因 switch (failure.getReason()) { case CaptureFailure.REASON_ERROR: // 硬件错误 break; case CaptureFailure.REASON_FLUSHED: // 会话被终止 break; } } };5. 高级功能实现指南5.1 多摄像头协同工作现代Android设备通常配备多个摄像头Camera2 API支持// 获取所有摄像头ID String[] cameraIds manager.getCameraIdList(); // 查询物理摄像头关系 String[] physicalIds characteristics.getPhysicalCameraIds(); // 同步控制多个摄像头 if (Build.VERSION.SDK_INT Build.VERSION_CODES.P) { CaptureRequest.Builder builder device.createCaptureRequest( CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(previewSurface1); builder.addTarget(previewSurface2); // 设置同步参数 builder.set(CaptureRequest.LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID, physicalId); }5.2 扩展模式支持高动态范围HDR模式// 检查设备支持情况 int[] availableModes characteristics.get( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES); // 启用HDR模式 if (Arrays.asList(availableModes).contains( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT)) { builder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT); }计算摄影模式// 夜间模式配置 if (isNightMode) { builder.set(CaptureRequest.CONTROL_SCENE_MODE, CaptureRequest.CONTROL_SCENE_MODE_NIGHT); builder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_HIGH_QUALITY); }在实际项目中Camera2 API的这些高级功能需要结合具体设备能力进行适配。不同厂商的实现可能存在差异因此健壮的相机应用应该包含完善的能力检测和回退机制。