Camera2(api2) 打开过程(一)
发布日期:2021-05-19 23:22:15 浏览次数:17 分类:精选文章

本文共 2351 字,大约阅读时间需要 7 分钟。

Camera2 的启动过程涉及多个组件和回调接口,理解这些回调的执行流程对开发 Camera 应用至关重要。本文将分步分析 Camera2 开启过程及相关回调的处理逻辑。

一、Camera2 开启过程

  • CameraManager 调用 openCamera 方法

    应用层通过 CameraManager.openCamera() 启动 Camera2。在实际实现(如 Camera2OneCameraOpenerImpl.java)中,内部通过 CameraDevice.StateCallback 回调链进行操作。

  • ** CameraDevice.StateCallback 的处理**

    这个回调接口用于跟踪 CameraDevice 的状态变化。当 CameraDevice.opened() 被触发时,调用 OneCameraCreator.create() 创建相机实例。

    public void onOpened(CameraDevice device) {    try {        CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(device.getId());        OneCamera oneCamera = OneCameraCreator.create(device, characteristics, ...);        if (oneCamera != null) {            openCallback.onCameraOpened(oneCamera);        } else {            openCallback.onFailure();        }    } catch (CameraAccessException e) {        // 处理异常    }}
  • 回调到应用层

    via OpenCallback(intellijenerateid=1) 接口,通知应用层 Camera 已正常打开或发生失败。

  • 二、启动后续操作

  • 调用 startPreview 方法

    在 CameraManager 中通过 OneCamera.startPreview() 启动预览,准备接收图像数据。

    camera.startPreview(..., new CaptureReadyCallback() { ... });
  • 配置捕捉会话

    via CameraCaptureSession.StateCallback 回调。

    public void onConfigured(CameraCaptureSession session) {    boolean success = repeatingPreview(...);    listener.onReadyForCapture();}
  • 启动重复请求处理

    在 OneCameraImpl 中,调用 setRepeatingRequest() 方法,持续接收图像数据。

    mCaptureSession.setRepeatingRequest(builder.build(), mCaptureCallback, ...);
  • 三、回调分析

  • CameraDevice.StateCallback

    • onOpened:Camera 已准备就绪,调用接下来的配置步骤。
    • onDisconnected:Camera 断开连接,切断所有 Camera 操作。
    • onClosed:Camera 已关闭,尝试再次访问将抛出异常。
  • CameraCaptureSession.StateCallback

    • onConfigured:捕捉会话准备完成,通知前置回调 ReadyForCapture。
    • onConfigureFailed:配置失败,清空所有入队的捕捉请求。
  • CaptureReadyCallback

    • onReadyForCapture:系统准备就绪,等待拍摄请求。
  • CaptureCallback

    • onCaptureStarted:开始图像捕捉。
    • onCaptureCompleted:获取所有捕捉结果,保存到 dng 或 jpeg 文件中。
  • 四、技术实现细节

  • 异步操作处理

    调用 CameraDevice 方法往往是异步的,回调链确保操作完成后依次执行。例如,开启 CameraDevice.startPreview 可能 trigger 个回调链,准备好后才能进行后续操作。

  • 回调代理与委托

    使用 CallbackProxies 构建透明的回调代理,避免直接操作 CameraDevice 的复杂性。

    public static class SessionStateCallbackProxy    extends CameraCaptureSession.StateCallback {    public void onConfigured(CameraCaptureSession session) {        mProxy.invoke("onConfigured", session);    }}
  • 内存管理

    Camera devices 需要专用内存区域来处理图像数据,及时释放资源防止内存泄漏。

  • 五、总结

    Camera2 的启动过程涉及复杂的回调链和异步操作,理解这些流程有助于开发高效的相机应用。通过分析 CameraManager、高层控制器等模块,可以清晰地理解各个回调的作用和调用顺序,并据此优化应用性能,确保流程的流畅性和稳定性。

    上一篇:LeakCanary 中文使用说明
    下一篇:代码中dumphprof数据

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月22日 10时16分38秒