Camera_API2分析.doc

上传人:小** 文档编号:88566097 上传时间:2019-05-03 格式:DOC 页数:53 大小:1.06MB
返回 下载 相关 举报
Camera_API2分析.doc_第1页
第1页 / 共53页
Camera_API2分析.doc_第2页
第2页 / 共53页
Camera_API2分析.doc_第3页
第3页 / 共53页
Camera_API2分析.doc_第4页
第4页 / 共53页
Camera_API2分析.doc_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《Camera_API2分析.doc》由会员分享,可在线阅读,更多相关《Camera_API2分析.doc(53页珍藏版)》请在金锄头文库上搜索。

1、一. android6.0源码分析之Camera API2.0简介 前面几篇主要分析的是Android Camera API1.0的架构以 及初始化流程,而google在android5.0(Lollipop)开始对Camera的架构进行了调整,为了适应HAL3,新添加实现了 CameraDeviceClient,而Camera API1.0已经被deprecated(即可能在更新的版本里会不支持此API).1、Camera API2.0的架构图Camera API2.0下的Camera架构与API1.0有所区别,下面将给出Camera API2.0以及Camera HAL3.2+下的Came

2、ra的总体架构图: 由图可知,Java层 要想与C+层的CameraService层进行通信,都是通过Java层的IPC Binder进制进行的,主要包括ICameraService.aidl以及ICameraDeviceUser.aidl两个接口来实现,其会在 Java层维护一个CameraDeviceImpl即Camera设备的代理,而CameraService以及CameraDeviceImpl的初始化会在此文的第二,第三节进行分析。而Java层对Camera的具体操作的操作流程大致为,Java层通过Device代理发送一个 CaptureRequest,而C+层进行相应的处理,再调用相

3、应的回调来通知Java相应的处理结果,并将相应的Capture数据保存在 Surface Buffer里,这样Java层在回调函数中可以对数据进行相应的处理。而对于具体操作流程的分析,请参考文章开始时的Camera2相关文章的连接。2、Java层的CameraService的实现和应用从Camera API2开始,Camera的实现方式有所不同,最主要的区别是不再使用JNI来调用本地代码,从而获得本地CameraService,并实现其C/S 模式的通信,而是直接在Java层通过Java层的IPC Binder机制来获取Java层的CameraService的代理对象,从而直接在Java层获取

4、本地的CameraService与Camera Device进行相应的通信。 相应的代码及目录: ICameraService.aidl:frameworks/base/core/java/android/hardware CameraService.cpp:frameworks/av/services/camera/libcameraservice CameraManager.java:frameworks/base/core/java/android/hardware/camera2获取CameraService的核心代码如下:/CameraManager.javaprvate void

5、connectCameraServiceLocked() if(mCameraService != null)return; /获取Binder IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME); if(cameraServiceBinder = null) return; try cameraServiceBinder.linkToDeath(this,/*flags*/ 0); catch(RemoteException e) return; ICameraService

6、cameraServiceRaw = ICameraService.Stub.asInterface(cameraServiceBinder); /根据cameraServiceRaw 创建CameraService实例 ICameraService cameraService = CameraServiceDecorator.newInstance(cameraServiceRaw); . try /添加监听 cameraService.addListener(this); /赋值给mCameraService的全局变量 mCameraService = cameraService; cat

7、ch(CameraRuntimeException e) . 由代码可知,通过Java层的Binder从ServiceManager里获取了一个Java层的CameraService实例,在打开 Camera的流程中,会通过此CameraService(Native的CameraService)与Camera通信,而其中的通信通过 ICameraDeviceUser来实现,接下来分析ICameraDeviceUser的实现。3、ICameraDeviceUser.aidl的通信实现Java层与C+ CameraService层之间的通信,通过封装了一个CameraDeviceUser来实现,它

8、只是在Java层使用了AIDL技术来实现 Client,即在Java层维护了一个CameraDevice,这样的好处是响应速度更快,因为这样不需要通过每次进入Native层来完成通信,而可以通过Java层的IPC Binder机制即可完成。即API2.0通过AIDL实现一个接口ICameraDeviceUser,从而在Java层维护一个Camera proxy,之后的通信都是通过此代理CameraDeviceImpl来实现。相关代码及目录: ICameraDeviceUser.aidl:frameworks/base/core/java/android/hardware/camera2 ICa

9、meraDeviceUser.cpp:frameworks/av/camera/camera2 CameraDeviceImpl.java:frameworks/base/core/java/android/hardware/camera2/impl获取Camera Device的Java层代理的核心代码如下:/CameraManager.javaprivate CameraDevice openCameraDeviceUserAsync(.) /初始化Camera Java层代理对象 CameraDevice device = null; try synchronized(mLock) /初

10、始化ICameraDeviceUser ICameraDeviceUser cameraUser = null; /初始化具体的CameraDevice代理 android.hardware.camera2.impl.CameraDeviceImpl deviceImpl = new android.hardware. camera2.impl.CameraDeviceImpl(cameraId,callback,handler,characteristics); BinderHolder holder = new BinderHolder(); ICameraDeviceCallbacks

11、callbacks = deviceImpl.getCallbacks(); . try /如果支持HAL3.2+的devices if(supportsCamera2ApiLocked(cameraId) /获取CameraService ICameraService cameraService = CameraManagerGlobal.get().getCameraService(); . /连接设备 cameraService.connectDevice(callbacks,id,mContextgetOpPackageName() ,USE_CALLING_UID,holder);

12、/通过Binder获得打开的Camera设备返回的Camera代理 cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder(); else/否则用遗产API cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks,id); catch(.) . /包装代理对象 deviceImpl.setRemoteDevice(cameraUser); device = deviceImpl; catch(.) . 返回Camera代理 return device;由

13、代码可知,首先获取CameraService,然后通过它来开启Camera,而开启成功后,C+层会返回一个Camera device代理对象,此处即为ICameraDeviceUser,所以在Java层对其进行相应的封装,变成一个CameraDeviceImpl对象,此后,只要需要对Camera进行操作,都会调用CameraDeviceImpl对象的相关方法,并通过ICameraDeviceUser以及Java IPC Binder来与本地的Camera device进行通信,至此,Camera API2.0的框架就分析结束了,具体的操作,如Camera的初始化,preview,capture等流程的分析,请看文章开始时,所列出的分析链接。二. android6.0源码分析之Camera2 HAL分析 在上一篇文章对Camera API2.0的框架进行了简单的介绍,其中Camera HAL屏蔽了底层的实现细节,并且为上层提供了相应的接口,具体的HAL的原理,个人觉得老罗的文章Android硬件抽象层(HAL)概要介绍和学习计划分析的很详细,这里不做分析,本文将只分析Camera HAL的初始化等相关流程。 1、Camera HAL的初始化Camera HAL的初始加载是在Native的CameraService初始化流程中的,而CameraService初始化是

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号