Camera2 的核心设计思想是流水线(Pipeline)架构。它就像一个高度自动化的工厂:你提交一份生产订单(CaptureRequest),相机硬件(芯片和镜片)按照订单加工,最后输出产品(图片数据流)和生产报告(CaptureResult)。
下面我们把这个复杂的流水线拆解为四个核心阶段:
1. 打开设备 (Open Device)
这是流水线的准备阶段,目的是获取相机硬件的控制权。
核心类:
CameraManager、CameraDevice具体流程:
获取系统服务:通过
context.getSystemService(Context.CAMERA_SERVICE)拿到CameraManager。筛选相机 ID:调用
manager.getCameraIdList(),通常0代表后置主摄,1代表前置。异步打开:调用
manager.openCamera(cameraId, stateCallback, handler)。状态监听:在
CameraDevice.StateCallback回调中,如果成功,会收到一个CameraDevice对象。这个对象就代表了当前的相机硬件。
注意点:必须在
AndroidManifest.xml中声明CAMERA权限,且在调用openCamera前进行动态权限检查。
2. 会话建立 (Create Capture Session)
相机打开后,还不能直接工作,必须建立一条通信管道,告诉相机你要把数据输出到哪里。
核心类:
CameraCaptureSession、Surface具体流程:
准备接收端(Surface):相机的数据需要有地方接收。比如,UI 预览界面(
TextureView或SurfaceView的 Surface)、负责录像的组件(MediaRecorder的 Surface),或者负责处理数据的组件(ImageReader的 Surface)。配置会话:将所有需要用到的
Surface包装成OutputConfiguration,放到一个列表里。创建会话:调用
cameraDevice.createCaptureSession(List<Surface>, stateCallback, handler)(在较新版本 Android 中推荐使用SessionConfiguration)。会话就绪:当底层硬件把这些输出通道全部打通后,会触发
CameraCaptureSession.StateCallback中的onConfigured(session)。此时,CameraCaptureSession管道正式建立完毕。
关键限制:一旦会话建立,输出目标(Surface)就固定了。如果中途想增加一个输出端(比如从“纯预览”切换到“边预览边录像”),必须销毁当前会话,重新建立新会话(切换时画面可能会有轻微闪烁)。
3. 下发请求 (CaptureRequest)
管道建好了,现在你可以向相机下发具体的“工作任务”了。CaptureRequest 就是那份生产订单,它包含了所有的控制参数。
核心类:
CaptureRequest、CaptureRequest.Builder具体流程:
创建模板:调用
cameraDevice.createCaptureRequest(TEMPLATE_PREVIEW)。系统提供了几种预设模板(如预览TEMPLATE_PREVIEW、拍照TEMPLATE_STILL_CAPTURE、录像TEMPLATE_RECORD),帮你自动配置好基础参数。定制参数:通过
builder.set(CaptureRequest.KEY, value)精确控制硬件。例如:builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)(开启持续自动对焦)手动调节 ISO、曝光时间、闪光灯等。
绑定目标:必须明确这份订单的数据送往哪个接收端,通过
builder.addTarget(surface)绑定。发送请求:
持续重复请求(用于预览/录像):
session.setRepeatingRequest(request, callback, handler)。相机会以 30 帧/秒的速度不断复制这份订单进行生产。单次请求(用于拍照):
session.capture(request, callback, handler)。相机只执行一次该订单(通常是高画质捕捉)。
4. 结果返回 (CaptureResult)
当相机硬件按照 CaptureRequest 完成一帧的拍摄后,它会把产生的数据和元数据(Metadata)扔回给开发者。
核心类:
TotalCaptureResult(继承自CaptureResult)、ImageReader/Surface具体流程:
图像数据走向:硬件生成的画面像素数据,直接流向了你在
CaptureRequest中绑定的Surface(例如直接显示在屏幕上,或者流进ImageReader触发onImageAvailable供你保存文件)。状态数据走向:硬件拍摄这一帧时的具体物理状态,会通过
CameraCaptureSession.CaptureCallback中的onCaptureCompleted(session, request, result)回调给你。解析解析报告:通过
result.get(CaptureResult.KEY)可以获取这一帧的真实物理参数。例如:你想知道刚才对焦成功了没有,可以获取
CaptureResult.CONTROL_AF_STATE。你想知道自动曝光算出的真实 ISO 是多少,可以获取
CaptureResult.SENSOR_SENSITIVITY。
总结:完整闭环拓扑图

这个闭环在预览时每秒运行 30 次以上,给予了开发者对每一帧画面的绝对控制权。