版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、CameraAPP!分析之对cameraframework层封装解析Android4.4版本的camera和4.0版本的设计差距还是很大的,4.0版本以前的camera在是camera主activity中直接调用camerahal层的的接口(如android.hardware.camera.open(),android.hardware.camera.setPreviewDisplay(),android.hardware.camera.startPreview()等)与cameradevice通信。Android4.4版本cameraapp对cameradevice的访问又封装了次,对cam
2、eradevice的访问必须经过cameramanager接口,cameramanager接口定义了camera基本操作,这样便于控制和管理cameradevice。下图为相关类关系图。I.CameraManager接口:提供的访问camera设备基本的操作,实现类必须调用CameraManager.cameraOpen获取CameraManager.CameraProxy接口对象来控制camera,实现CameraManager接口的类必须拥有一个独立于主线程的线程来实现对camera的操作,CameraManager接口也包装回调函数2.CameraProxy接口,封装在CameraMan
3、ager接口之内,接收对camera操作请求,发送消息至Ucamerhandleo所有对camera的操作都经由改接口,进行异步处理3 .AndroidCameraManagerlmpl类,该类实现了CameraManager接口,与cameraframework层接口直接通信,起到Jcameraapp与cameraframework对话中介的作用。4 .AndroidCameraProxyIm瞰,AndroidCameraManagerlmpl内部类,实现CameraManager.CameraProxy接口,CameraProxy已经介绍过了就是控制对camera的访问,AndroidCa
4、meraProxylmpl类实现了具体的操作。5 .CameraManagerFactoryi,这个类的实现很简单,看到Factory,会想到软件设计中的工厂模式,这里就是封装了创建CameraManager对象的细节6.CameraHolder类,看名字就可以看出这个类的基本功能了,就用来保存camera实力对象的,用在不同的module之间快速切换AA以上是我们对cameraapp对cameraframework层接口封装了的介绍。下面我们来看camera初始化过程。时序图如下StepI.CameraHolder.instance。publicstaticsynchronizedCamer
5、aHolderinstance()if(sHolder=null)sHolder=newCameraHolder();returnsHolder;这个函数定义在Camera2src/com/android/cameraCameraHolder.java中这个函数很简单就是创建一个CameraHolder实例,弁保存在变量sHolder中,如果是第一次调用sHolder肯定是null,接着new一个CameraHolder实例对象,这样的设计在android中经常见到,一种单例设计模式。现在我们来看看CameraHolder都做了些什么privateCameraHolder()HandlerTh
6、readht=newHandlerThread("CameraHolder");ht.start();mHandler=newMyHandler(ht.getLooper();if(mMockCameraInfo!=null)mNumberOfCameras=mMockCameraInfo.length;mInfo=mMockCameraInfo;elsemNumberOfCameras=android.hardware.Camera.getNumberOfCameras();mInfo=newCameraInfomNumberOfCameras;for(inti=0;i&
7、lt;mNumberOfCameras;i+)mInfoi=newCameraInfo();android.hardware.Camera.getCameraInfo(i,mInfoi);/getthefirst(smallest)backandfirstfrontcameraidfor(inti=0;i<mNumberOfCameras;i+)if(mBackCameraId=-1&&mInfoi.facing=CameraInfo.CAMERA_FACING_BACK)mBackCameraId=i;elseif(mFrontCameraId=-1&&
8、mInfoi.facing=CameraInfo.CAMERA_FACING_FRONT)mFrontCameraId=i;CameraHolder对象,首先创建了一个HandlerThread线程,独立于mainthread,启动该线程。接着创建自己MyHandler,用于在HandlerThread中处理自己的事物。最后初始化mInfo变量,保存camerainfooStep2.CameraHolder.open()publicsynchronizedCameraProxyopen(Handlerhandler,intcameraId,CameraManager.CameraOpenErr
9、orCallbackcb)Assert(!mCameraOpened);if(mCameraDevice!=null&&mCameraId!=cameraId)mCameraDevice.release();mCameraDevice=null;mCamerald=-1;)if(mCameraDevice=null)Log.v(TAG,"opencamera"+cameraId);if(mMockCameraInfo=null)mCameraDevice=CameraManagerFactory.getAndroidCameraManager().camer
10、aOpen(handler,cameraId,cb);elseif(mMockCamera!=null)mCameraDevice=mMockCameracameraId;elseLog.e(TAG,"MockCameraInfofound,butnoMockCameraprovided.");mCameraDevice=null;if(mCameraDevice=null)Log.e(TAG,"failtoconnectCamera:"+mCameraId+",aborting.");returnnull;)mCamerald=ca
11、merald;mParameters=mCameraDevice.getCamera().getParameters();elseif(!mCameraDevice.reconnect(handler,cb)Log.e(TAG,"failtoreconnectCamera:"+mCameraId+",aborting.");returnnull;mCameraDevice.setParameters(mParameters);mCameraOpened=true;mHandler.removeMessages(RELEASE_CAMERA);mKeepB
12、eforeTime=0;returnmCameraDevice;该函数首先判断当前camera是否已经打开,如果已经打开。需要先调用mCameraDevice.release()释放掉,在重新调用CameraManagerFactory获取mCameraDevice实例对象。Step3.CameraManagerFactorygetAndroidCameraManager()PublicstaticsynchronizedCameraManagergetAndroidCameraManager()if(sAndroidCameraManager=null)sAndroidCameraManag
13、er=newAndroidCameraManagerImpl();returnsAndroidCameraManager;该函数定义在Camera2src/com/android/camera/CameraManagerFactory.java文件中,代码很简单newAndroidCameraManagerImpl对象返回给调用者。AndroidCameraManagerImpl()HandlerThreadht=newHandlerThread("CameraHandlerThread");ht.start();mCameraHandler=newCameraHandle
14、r(ht.getLooper();从这个类的初始化中可以看到,该对象内部创建了自己的HandlerThread,并启动,这个很重要,后期的client对camera的操作都在这个线程中完成的。后面遇到具体操作我们在分析。Step4.AndroidCameraManagerImplcameraOpen()publicCameraManager.CameraProxycameraOpen(Handlerhandler,intcamerald,CameraOpenErrorCallbackcallback)mCameraHandler.obtainMessage(OPEN_CAMERA,camera
15、Id,0,CameraOpenErrorCallbackForward.getNewInstance(handler,callback).sendToTarget();mCameraHandler.waitDone();if(mCamera!=null)returnnewAndroidCameraProxyImpl();elsereturnnull;这个函数定义在Camera2/src/com/android/camera/AndroidCameraManagerImpl.java文件中函数首先通过mCameraHandler获取OPEN_CAMERA肖息并发送给mCameraHandler处理,mCameraHandler处理是在AndroidCameraManagerImpl初始化的时候创建的HandlerThread线程中处理的。发送完消息之后调用mCameraHandler.waitDone()阻塞当前主线程,等待framework层的camera开启。Step5.android.hardware.Camera.open在上一步发送了OPEN_CAMERA,旨令给mCameraHandler。mCameraHandler收到这个指令之后调
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 德宏州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解
- 梧州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(培优b卷)
- 崇明县农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及完整答案详解1套
- 2026年省属虚拟市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(名校卷)
- 阿拉善盟农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(夺冠)
- 云浮市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及完整答案详解
- 三门峡市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(巩固)
- 上海市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(达标题)
- 廊坊市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(完整版)
- 2026年定西市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(培优)
- 二手车无事故合同
- 青岛版(五年制)数学五年级上册第二单元《关注环境 分数加减法(二)》单元测试卷(含解析)
- 2025江西省交通投资集团有限责任公司招聘78人考试参考试题及答案解析
- 全国艾滋病检测技术规范(2025年修订版)(征求意见稿)
- 2025年石台县辅警招聘考试笔试试题含答案
- 2025年及未来5年中国网闸行业市场深度评估及投资战略规划报告
- 电商行业2025年消费趋势与竞争策略洞察报告
- 给水管线施工保护专项方案
- 2025医院招考财务试题及答案
- 2025年湖北省武汉市辅警(协警)招聘考试题库及答案
- 动火安全培训课件
评论
0/150
提交评论