android60源码分析之cameraapi20下的初始化流程分析.docx

上传人:b****8 文档编号:9846466 上传时间:2023-02-07 格式:DOCX 页数:12 大小:22.71KB
下载 相关 举报
android60源码分析之cameraapi20下的初始化流程分析.docx_第1页
第1页 / 共12页
android60源码分析之cameraapi20下的初始化流程分析.docx_第2页
第2页 / 共12页
android60源码分析之cameraapi20下的初始化流程分析.docx_第3页
第3页 / 共12页
android60源码分析之cameraapi20下的初始化流程分析.docx_第4页
第4页 / 共12页
android60源码分析之cameraapi20下的初始化流程分析.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

android60源码分析之cameraapi20下的初始化流程分析.docx

《android60源码分析之cameraapi20下的初始化流程分析.docx》由会员分享,可在线阅读,更多相关《android60源码分析之cameraapi20下的初始化流程分析.docx(12页珍藏版)》请在冰豆网上搜索。

android60源码分析之cameraapi20下的初始化流程分析.docx

android60源码分析之cameraapi20下的初始化流程分析

android6.0源码分析之cameraapi2.0下的初始化流程分析

在文章android源码分析之CameraAPI2.0简介中,对CameraAPI2.0的框架以及代码做了简单介绍,本文将基于android6.0源码,分析CameraAPI2.0下的Camera2内置应用中,对Camera的初始化的流程分析,主要涉及CameraHAL3.0,Java层的IPCBinder,Native层的CameraService的C/S服务架构等关键点。

Camera2相关分析文章目录:

android6.0源码分析之CameraAPI2.0简介

android6.0源码分析之Camera2HAL分析

android6.0源码分析之CameraAPI2.0下的初始化流程分析

android6.0源码分析之CameraAPI2.0下的Preview(预览)流程分析

android6.0源码分析之CameraAPI2.0下的Capture流程分析

android6.0源码分析之CameraAPI2.0下的video流程分析

CameraAPI2.0的应用1、Camera2初始化的应用层流程分析Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程。

Camera2.0首先启动的是CameraActivity,而它继承自QuickActivity,在代码中你会发现没有重写OnCreate等生命周期方法,因为此处采用的是模板方法的设计模式,在QuickActivity中的onCreate方法调用的是onCreateTasks等方法,所以要看onCreate方法就只须看onCreateTasks方法即可:

//CameraActivity.java@OverridepublicvoidonCreateTasks(Bundlestate){Profileprofile=mProfiler.create('CameraActivity.onCreateTasks').start();...mOnCreateTime=System.currentTimeMillis();mAppContext=getApplicationContext();mMainHandler=newMainHandler(this,getMainLooper());…try{//初始化OneCameraOpener对象①mOneCameraOpener=OneCameraModule.provideOneCameraOpener(mFeatureConfig,mAppContext,mActiveCameraDeviceTracker,ResolutionUtil.getDisplayMetrics(this));mOneCameraManager=OneCameraModule.provideOneCameraManager();}catch(OneCameraExceptione){...}…//建立模块信息②ModulesInfo.setupModules(mAppContext,mModuleManager,mFeatureConfig);…//进行初始化③mCurrentModule.init(this,isSecureCamera(),isCaptureIntent());…}12345678910111213141516171819202122232425如代码所示,重要的有以上三点,先看第一点:

//OneCameraModule.javapublicstaticOneCameraOpenerprovideOneCameraOpener(OneCameraFeatureConfigfeatureConfig,Contextcontext,ActiveCameraDeviceTrackeractiveCameraDeviceTracker,DisplayMetricsdisplayMetrics)throwsOneCameraException{//创建OneCameraOpener对象Optionalmanager=Camera2OneCameraOpenerImpl.create(featureConfig,context,activeCameraDeviceTracker,displayMetrics);if(!

manager.isPresent()){manager=LegacyOneCameraOpenerImpl.create();}...returnmanager.get();}1234567891011121314它调用Camera2OneCameraOpenerImpl的create方法来获得一个OneCameraOpener对象,以供CameraActivity之后的操作使用,继续看create方法:

//Camera2OneCameraOpenerImpl.javapublicstaticOptionalcreate(OneCameraFeatureConfigfeatureConfig,Contextcontext,ActiveCameraDeviceTrackeractiveCameraDeviceTracker,DisplayMetricsdisplayMetrics){...CameraManagercameraManager;try{cameraManager=AndroidServices.instance().provideCameraManager();}catch(IllegalStateExceptionex){...}//新建一个Camera2OneCameraOpenerImpl对象OneCameraOpeneroneCameraOpener=newCamera2OneCameraOpenerImpl(featureConfig,context,cameraManager,activeCameraDeviceTracker,displayMetrics);returnOptional.of(oneCameraOpener);}12345678910111213141516很明显,它首先获取一个cameraManger对象,然后根据这个cameraManager对象来新创建了一个Camera2OneCameraOpenerImpl对象,所以第一步主要是为了获取一个OneCameraOpener对象,它的实现为Camera2OneCameraOpenerImpl类。

继续看第二步,ModulesInfo.setupModules:

//ModulesInfo.javapublicstaticvoidsetupModules(Contextcontext,ModuleManagermoduleManager,OneCameraFeatureConfigconfig){Resourcesres=context.getResources();intphotoModuleId=context.getResources().getInteger(R.integer.camera_mode_photo);//注册Photo模块registerPhotoModule(moduleManager,photoModuleId,SettingsScopeNamespaces.PHOTO,config.isUsingCaptureModule());//计算你还Photo模块设置为默认的模块moduleManager.setDefaultModuleIndex(photoModuleId);//注册Videa模块registerVideoModule(moduleManager,res.getInteger(R.integer.camera_mode_video),SettingsScopeNamespaces.VIDEO);if(PhotoSphereHelper.hasLightCycleCapture(context)){//开启闪光//注册广角镜头registerWideAngleModule(moduleManager,res.getInteger(R.integer.camera_mode_panorama),SettingsScopeNamespaces.PANORAMA);//注册光球模块registerPhotoSphereModule(moduleManager,res.getInteger(R.integer.camera_mode_photosphere),SettingsScopeNamespaces.PANORAMA);}//若需重新聚焦if(RefocusHelper.hasRefocusCapture(context)){//注册重聚焦模块registerRefocusModule(moduleManager,res.getInteger(R.integer.camera_mode_refocus),SettingsScopeNamespaces.REFOCUS);}//如果有色分离模块if(GcamHelper.hasGcamAsSeparateModule(config)){//注册色分离模块registerGcamModule(moduleManager,res.getInteger(R.integer.camera_mode_gcam),SettingsScopeNamespaces.PHOTO,config.getHdrPlusSupportLevel(OneCamera.Facing.BACK));}intimageCaptureIntentModuleId=res.getInteger(R.integer.camera_mode_capture_intent);registerCaptureIntentModule(moduleManager,imageCaptureIntentModuleId,SettingsScopeNamespaces.PHOTO,config.isUsingCaptureModule());}1234567891011121314151617181920212223242526272829303132333435363738394041424344代码根据配置信息,进行一系列模块的注册,其中PhotoModule和VideoModule被注册,而其他的module则是根据配置来进行的,因为打开Camera应用,既可以拍照片也可以拍视频,此处,只分析PhoneModule的注册:

//ModulesInfo.javaprivatestaticvoidregisterPhotoModule(ModuleManagermoduleManager,finalintmoduleId,finalStringnamespace,finalbooleanenableCaptureModule){//向ModuleManager注册PhotoModule模块moduleManager.registerModule(newModuleManager.ModuleAgent(){@OverridepublicintgetModuleId(){returnmoduleId;}@OverridepublicbooleanrequestAppForCamera(){return!

enableCaptureModule;}@OverridepublicStringgetScopeNamespace(){returnnamespace;}@OverridepublicModuleControllercreateModule(AppControllerapp,Intentintent){Log.v(TAG,'EnableCaptureModule='+enableCaptureModule);//创建ModuleControllerreturnenableCaptureModule?

newCaptureModule(app):

newPhotoModule(app);}});}1234567891011121314151617181920212223242526272829303132由代码可知,它最终是由ModuleManager来新建一个CaptureModule实例,而CaptureModule其实实现了ModuleController,即创建了一个CaptureModule模式下的ModuleController对象,而真正的CaptureModule的具体实现为ModuleManagerImpl。

至此,前两步已经获得了OneCameraOpener以及新建了ModuleController,并进行了注册,接下来分析第三步,mCurrentModule.init(this,isSecureCamera(),isCaptureIntent()):

//CaptureModule.javapublicvoidinit(CameraActivityactivity,booleanisSecureCamera,booleanisCaptureIntent){...HandlerThreadthread=newHandlerThread('CaptureModule.mCameraHandler');thread.start();mCameraHandler=newHandler(thread.getLooper());//获取第一步中创建的OneCameraOpener对象mOneCameraOpener=mAppController.getCameraOpener();try{//获取前面创建的OneCameraManager对象mOneCameraManager=OneCameraModule.provideOneCameraManager();}catch(OneCameraExceptione){Log.e(TAG,'UnabletoprovideaOneCameraManager.',e);}`...//新建CaptureModule的UImUI=newCaptureModuleUI(activity,mAppController.getModuleLayoutRoot(),mUIListener);//设置预览状态的监听mAppController.setPreviewStatusListener(mPreviewStatusListener);synchronized(mSurfaceTextureLock){//获取SurfaceTexturemPreviewSurfaceTexture=mAppController.getCameraAppUI().getSurfaceTexture();}}12345678910111213141516171819202122232425262728首先获取前面创建的OneCameraOpener对象以及OneCameraManager对象,然后再设置预览状态监听,这里主要分析预览状态的监听:

//CaptureModule.javaprivatefinalPreviewStatusListenermPreviewStatusListener=newPreviewStatusListener(){...@OverridepublicvoidonSurfaceTextureAvailable(SurfaceTexturesurface,intwidth,intheight){updatePreviewTransform(width,height,true);synchronized(mSurfaceTextureLock){mPreviewSurfaceTexture=surface;}//打开CamerareopenCamera();}@OverridepublicbooleanonSurfaceTextureDestroyed(SurfaceTexturesurface){Log.d(TAG,'onSurfaceTextureDestroyed');synchronized(mSurfaceTextureLock){mPreviewSurfaceTexture=null;}//关闭CameracloseCamera();returntrue;}@OverridepublicvoidonSurfaceTextureSizeChanged(SurfaceTexturesurface,intwidth,intheight){//更新预览尺寸updatePreviewBufferSize();}...};1234567891011121314151617181920212223242526272829303132333435由代码可知,当SurfaceTexture的状态变成可用的时候,会调用reopenCamera()方法来打开Camera,所以继续分析reopenCamera()方法:

//CaptureModule.javaprivatevoidreopenCamera(){if(mPaused){return;}AsyncTask.THREAD_POOL_EXECUTOR.execute(newRunnable(){@Overridepublicvoidrun(){closeCamera();if(!

mAppController.isPaused()){//开启Camera并开始预览openCameraAndStartPreview();}}});}12345678910111213141516它采用异步任务的方法,开启一个异步线程来进行启动操作,首先关闭打开的Camera,然后如果AppController不处于暂停状态,则打开Camera并启动Preview操作,所以继续分析openCameraAndStartPreview方法:

//CaptureModule.javaprivatevoidopenCameraAndStartPreview(){...if(mOneCameraOpener==null){Log.e(TAG,'noavailableOneCameraManager,showingerrordialog');//释放CameraOpenCloseLock锁mCameraOpenCloseLock.release();mAppController.getFatalErrorHandler().onGenericCameraAccessFailure();guard.stop('NoOneCameraManager');return;}//Deriveobjectsnecessaryforcameracreation.MainThreadmainThread=MainThread.create();//查找需要打开的CameraIdCameraIdcameraId=mOneCameraManager.findFirstCameraFacing(mCameraFacing);...//打开CameramOneCameraOpener.open(cameraId,captureSetting,mCameraHandler,mainThread,imageRotationCalculator,mBurstController,mSoundPlayer,newOpenCallback(){@OverridepublicvoidonFailure(){//进行失败的处理...}@OverridepublicvoidonCameraClosed(){...}@OverridepublicvoidonCameraOpened(@NonnullfinalOneCameracamera){Log.d(TAG,'onCameraOpened:

'+camera);mCamera=camera;if(mAppController.isPaused()){onFailure();return;}...mMainThread.execute(newRunnable(){@Overridepublicvoidrun(){//通知UI,Camera状态变化mAppController.getCameraAppUI().onChangeCamera();//使能拍照按钮mAppController.getButtonManager().enableCameraButton();}});//至此,Camera打开成功,开始预览camera.startPreview(newSurface(getPreviewSurfaceTexture()),newCaptureReadyCallback(){@OverridepublicvoidonSetupFailed(){...}@OverridepublicvoidonReadyForCapture(){//释放锁mCameraOpenCloseLock.release();mMainThread.execute(newRunnable(){@Overridepublicvoidrun(){...onPreviewStarted();...onReadyStateChanged(true);//设置CaptureModule为Capture准备的状态监听mCamera.setReadyStateChangedListener(CaptureModule.this);mUI.initializeZoom(mCamera.getMaxZoom());mCamera.setFocusStateListener(CaptureModule.this);}});}});}},mAppController.getFatalErrorHandler());guard.stop('mOneCameraOpener.open()');}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1