最近刚做完Camera项目,正好利用这段时间梳理下Camera预览的流程。从系统启动注册CameraService,到应用打开相机,配置流建立通道,再到设置参数,最后回调onImageAvailable方法收到HAL层返回的数据,并将数据Buffer添加到SurfaceTextureScreenNail的缓存列表中,采用OpenGL ES将纹理绘制到Surface上。
应用在初始化的时候会通过上下文获得CameraManager对象的实例,调用该类的openCamera方法打开相机设备,接着会调用CameraService类的connectDevice方法,底层会返回ICameraDeviceUser的代理对象CameraDeviceClient,应用会回调CameraDevice.StateCallback类的onOpened方法,在该方法中调用createCaptureSession创建会话并完成流的配置。
ConfigureStream主要工作就是将Surface给到CameraServer,将CaptureRequest处理结果的Buffer数据填充到对应的Surface容器中,填完后由BufferQueue机制回调到应用的Surface控件的CallBack回调函数中。
接下来App便会调用setRepeatingRequest接口设置参数给CameraServer,当它在初始化时会启动一个循环线程等待接收Request,将CaptureRequest交给HAL处理,得到处理结果后取出处理结果CaptureResult,将Buffer填到App给到的Surface容器中。为了预览,则交给Preview的Surface容器;为了拍照,则交给ImageReader的Surface容器。
最终HAL层返回的数据通过PreviewCallBack接口的回调函数onCaptureCompleted将Buffer数据转换成纹理绘制到GLSurfaceView控件上,完成了相机预览的效果。