image.png (168.06 KB, 下载次数: 0)
下载附件
调用过程概览
2024-8-17 22:53 上传
[ol]
App在MainActivity 中使用一些预览控件,它们都包含一个surface作为取相机数据的容器。在openCamera之前:
[ol]
[/ol]
对于MainActivity 在onCreat的时候,调用API通知Framework Native Service-- CameraServer去 connect HAL ,打开硬件sensor
相关函数、方法
CameraManager.openCamera(String cameraId, CameraDevice.StateCallback callback, @Nullable Handler handler)
/*
接口打开相机设备。
@ String cameraId:相机设备编号
@ CameraDevice.StateCallback callback:相机设备打开状态监听(判断相机打开是否成功)的回调对象(调用openCamera()时必须传入该回调对象,才能打开相机设备)
@ Handler handler:指定执行回调方法的线程(可以是主线程,也可以后台线程)。
*/
--> ...
--> private CameraDevice openCameraDeviceUserAsync(String cameraId,
CameraDevice.StateCallback callback, Executor executor, final int uid)
throws CameraAccessException
对于 CameraDevice.StateCallback 须实现方法:
对于 openCameraDeviceUserAsync 方法,主要做了下面几件事:
流程概览图
OpenCamera成功的话,回调从CameraServer 通知到APP,在onOpened() 中调用preview的操作,在此时创建会话CameraCaptureSession 。创建过程中调用configStream(p)--参数中包含Surface的引用,也就是说,cameraServer包装了来自App的sureface容器为stream,再通过HIDL传给HAL,再由HAL继续configStream
相关函数、方法
CameraDevice.StateCallback.onOpened()// 回调方法,
--> CameraDevice.createCaptureSession(SessionConfiguration config)
/* @ SessionConfiguration config: 会话配置参数(聚合类参数,包含创建CameraCaptureSession的所有参数)
在打开相机设备之后便需要去创建一个相机会话,用于传输图像请求,其最终实现是调用该方法来进行实现的,
而该方法会去调用到Camera Framework中的createCaptureSessionInternal方法,该方法主要做了两件事:
首先调用configureStreamsChecked方法来配置数据流。
其次实例化了一个CameraCaptureImpl对象,并通过传入CameraCaptureSession.StateCallback回调类将该对象发送至至App中。
--> 而在configureStreamsChecked方法中会去调用ICameraDeviceUser代{过}{滤}理的一系列方法进行数据流配置,
其中调用cancelRequest方法停掉当前的的预览流程,调用deleteStream方法删除之前的数据流,调用createStream创建新的数据流,
最后调用endConfigure来进行数据流的配置工作,针对性的配置便在最后这个endConfigure方法中。
*/
--> CameraCaptureSession.setRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback callback,Handler handler)
/*
@ CaptureRequest request:无限期重复的CaptureRequest。
向Camera底层送一个CaptureRequest,底层不停重复送这一个CaptureRequest,不能为null
@ CameraCaptureSession.CaptureCallback callback: CaptureRequest处理状态监听的回调。
当一个CaptureRequest发送给相机设备,使用这个监听器跟踪该CaptureRequest的处理进度,CaptureRequest完成处理时会通知该回调对象。
该回调对象的所有方法都有默认的空实现,也可根据需求重写相应方法。
@ Handler handler:
CaptureRequest回调方法执行的线程。如果为null,表示使用当前线程的looper
*/
--> submitCaptureRequest
// Framework 层的方法。将此次Request下发到CameraService中。
SessionConfiguration 需配置参数:
[ol]
常用普通预览使用 SessionConfiguration.SESSION_REGULAR,高速预览使用 SessionConfiguration.SESSION_HIGH_SPEED
根据不同的场景选择需要的surface,创建 OutputConfiguration列表,以拍照模式为例,选择相机预览、拍照所需的surface作为相机图像数据最终输出对象,创建 OutputConfiguration列表参数。
通常,建议不要在主(UI)线程上执行相机操作。
onConfigured和 onConfigureFailed两个抽象方法必须重写。
[/ol]
而对于 CameraCaptureSession.StateCallback回调对象需实现方法:
[ol]
[/ol]
以上 onConfigured 和 onConfigureFailed两个抽象方法必须实现,其余的可以空实现
CameraCaptureSession
https://developer.android.google.cn/reference/android/hardware/camera2/CameraCaptureSession
[table]
[tr]
[td]Nested classes[/td]
[td][/td]
[/tr]
[tr]
[td]class