Android Camera2 API简述 (三)

2,055 阅读2分钟

这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

一、 CameraCaptureSession

CameraCaptureSession 是一个已配置好的CameraDevice的捕获会话,用于从相机捕获图像或重新处理先前在同一会话中从相机捕获的图像。

二、内部类

1. CameraCaptureSession.StateCallback

当相机捕捉事务的状态发生变化时,会回调这个类中的相应方法。

try {
    mCameraDevice.createCaptureSession(Arrays.asList(mPreviewSurface, mImageReader.getSurface()),
    new CameraCaptureSession.StateCallback() {

    @Override
    public void onConfigured(@NonNull CameraCaptureSession session) {
        mCaptureSession = session;
        //相机设备完成配置,并开始处理捕捉请求时回调
    }

    @Override
    public void onConfigureFailed(@NonNull CameraCaptureSession session) {
        Log.e(TAG, "ConfigureFailed. session: mCaptureSession");
        //该会话无法按照相应的配置发起请求时回调
    }
}, mBackgroundHandler); // handle 传入 null 表示使用当前线程的 Looper
} catch (CameraAccessException e) {
e.printStackTrace();
}

createCaptureSession(List outputs, CameraCaptureSession.StateCallback callback, Handler handler)

outputs : 输出的 Surface 集合。

callback : 创建会话的回调。

handler : 指定回调执行的线程。

2. CameraCaptureSession.CaptureCallback

这个类可以用来跟踪捕获请求发送的相机设备的各进度。

onCaptureStarted(当相机设备开始为请求捕捉输出图时) 、

onCaptureCompleted(当图像捕捉完全完成时,并且结果已经可用时回调该方法) 、

onCaptureFailed(对应 onCaptureCompleted 方法,当相机设备产生 TotalCaptureResult 失败时就回调该方法)等。

三、常用方法

1. int setRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)

不断的重复请求捕捉画面,常用于预览或者连拍场景。

2. int capture(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)

提交一个获取单张图片的捕捉请求,常用于拍照场景。

3. void close()

异步关闭这个 CameraCaptureSession

4. CameraDevice getDevice()

获取该 CameraCaptureSession 创建对应的 CameraDevice 对象。

四 、 最后

创建会话的话比较的费时,创建时间大概有几百毫秒,所以创建时需要配置完成相机设备的管道,然后控制分配内存缓冲区,并将图像发送到目标上。

所以,设置是异步的,CameraDevicecreateCaptureSessionCameraDevicecreateReprocessableCaptureSession 会发送会话可用的消息,由侦听器 CameraCaptureSession.StateCallback 回调,能够完成配置则调用 onConfigured 回调,将session变为活跃状态。无法完成配置,则调用 onConfigureFailed 回调,并且session不会变为活动状态。