和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、简介
二、Camera AIDL 接口
三、Camera Service 主程序
相机服务层
一、简介
Camera Service被设计成一个独立进程,作为一个服务端,处理来自Camera Framework 客户端的跨进程请求,并在内部进行一定的操作,随后作为客户端将请求再一次发送至作为服务端的Camera Provider,整个流程涉及到了两个跨进程操作,前者通过AIDL机制实现,后者通过HIDL机制实现,由于在于Camera Provider通信的过程中,Service是作为客户端存在的,所以此处我们重点关注AIDL以及Camera Service 主程序的实现。
程序Android 转于网络图片
二、Camera AIDL 接口
在介绍Camera AIDL之前,不妨来简单了解下何为AIDL,谷歌为什么要实现这么一套机制?
在Android系统中,两个进程通常无法相互访问对方的内存,为了解决该问题,谷歌提出了Messager/广播以及后来的Binder,来解决这个问题,但是如果某个进程需要对另一个进程中进行多线程的并发访问,Messager和广播效果往往不是很好,所以Binder会作为主要实现方式,但是Binder的接口使用起来比较复杂,对开发者特别是初学者并不是很友好,所以为了降低跨进程开发门槛,谷歌开创性地提出了AIDL(自定义语言)机制,主动封装了Binder的实现细节,提供给开发者较为简单的使用接口,极大地提升了广大开发者的开发效率。
按照谷歌的针对AIDL机制的要求,需要服务端创建一系列*.aidl文件,并在其中定义需要提供给客户端的公共接口,并且予以实现,接下来我们来看下几个主要的aidl文件。
程序Android 转于网络图片
ICameraService.aidl定义了ICameraService 接口,实现主要通过CameraService类来实现,主要接口如下:
getNumberOfCameras:获取系统中支持的Camera 个数
connectDevice():打开一个Camera 设备
addListener(): 添加针对Camera 设备以及闪光灯的监听对象
ICameraDeviceCallbacks.aidl文件中定义了ICameraDeviceCallbacks接口,其实现主要由Framework中的CameraDeviceCallbacks类进行实现,主要接口如下:
onResultReceived:一旦Service收到结果数据,便会调用该接口发送至Framework
onCaptureStarted():一旦开始进行图像的采集,便调用该接口将部分信息以及时间戳上传至Framework
onDeviceError(): 一旦发生了错误,通过调用该接口通知Framework
ICameraDeviceUser.aidl定义了ICameraDeviceUser接口,由CameraDeviceClient最终实现,主要接口如下:
disconnect:关闭Camera 设备
submitRequestList:发送request
beginConfigure:开始配置Camera 设备,需要在所有关于数据流的操作之前
endConfigure:结束关于Camera 设备的配置,该接口需要在所有Request下发之前被调用