
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、高层控制器等模块,可以清晰地理解各个回调的作用和调用顺序,并据此优化应用性能,确保流程的流畅性和稳定性。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月22日 10时16分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux常用命令date
2023-02-04
linux常用命令合集及常用工具指令集
2023-02-04
Linux常用命令详解与示例
2023-02-04
linux常用命令:cal 命令
2023-02-04
Linux常用嗅探工具(1):fping命令
2023-02-04
linux常用快捷键
2023-02-04
Linux常用的网络命令有哪些?快速入门!
2023-02-04
linux常见命令
2023-02-04
linux常见操作命令及操作符意思
2023-02-04
Linux常见操作命令整理
2023-02-04
linux库列表
2023-02-04
linux开启nscd服务缓存加速-DNS缓存
2023-02-04
Linux开放的端口太多了?教你一招找出所有开放的端口,然后直接干掉!
2023-02-04
linux开机启动脚本制作
2023-02-04
Linux性能优化思路和方法
2023-02-04
linux打印函数是哪个文件夹,如何从linux上的文件夹中找到一个函数
2023-02-04
Linux搭建FTP服务(附FTP Server 服务器客户端工具)
2023-02-04
Linux搭建HTTP服务
2023-02-04
Linux搭建NFS服务器
2023-02-04
Linux搭建NTP服务器
2023-02-04