Android Camera启动流程---应用层

本文详细解析了Android相机应用层的启动流程,从CameraActivity的onCreateTasks开始,经过preInit、postInit、PhotoModule初始化,到onStartTasks、onResumeTasks,直至相机打开请求在mOncreateOpencamera中发起,通过CameraController的checkAndOpenCamera方法。当相机成功打开后,一系列回调如onCameraOpened和startPreview等确保预览功能的启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天来分析下camera的启动的流程,camera模块的整个流程是很复杂的,贯穿整个Android上下层。这里以展锐平台的原生相机为例,分析一下app层的camera启动流程。

准备工作

Camera模块的launcher入口即是CameraActivity,其继承自QuickActivity,QuickActivity的作用是解决两次onResume的bug,所以我们不必关心,直接来看CameraActivity中的onCreateTasks方法(调用自QuickActivity中的onCreate方法)。

CameraActivity.onCreateTasks()

文件路径\DreamCamera2\src\com\android\camera\CameraActivity.java

//启动相机时调用
    @Override
    public void onCreateTasks(Bundle state) {
   
   
        //首先判断是不是分屏模式,相机不支持分屏
        if (isInMultiWindowMode()) {
   
   
			CameraUtil.toastHint(this, R.string.multi_window_tip);
            finish();
            return;
        }
        ...
        //相机初始化准备(一些handler的初始化,以及判断camera是通过什么启动的,具体请看下面代码分析)
        preInit();
        //create时检查相机的各项权限
        mSuccess = checkPermissionOnCreate();
        profile.mark("checkPermissionOnCreate()");
        ...
        //初始化handlerThread,主要是为了获得两个handler(synchandler和requestHandler)
        //且获取cameramanager(camera的系统service),注册camera是否available的回调
        initializeHandlerThread();
        
        //开启多线程,初始化各项配置
        //需要注意的是,这里获取各种类,基本都是展锐平台封装的,在\framework\ex\camera2\portability\src\com\android\ex路径下展锐封装了Google原生的camera相关的api
        //创建OneCameraManager对象,是camera的hardware manager,基于camera2
        THREAD_POOL_EXECUTOR.execute(mOncreateOneCameraManager);

        //创建ModuleManager对象,注册各种相机模组,并设置当前模组(通过设置mCurrentModuleIndex)
        THREAD_POOL_EXECUTOR.execute(mOncreateModulesInfoAndCurrentModule);

        // 主要是创建cameraController对象,open camera、close camera、release camera,这些操作实际上是通过cameraAgent.cameraproxy来操作的
        // 成功打开camera会返回一个cameraproxy对象,用于相机中各个功能的交互,
        // cameraproxy对象可以获取cameraInfo对象,可以得到camera的各种信息,有几个摄像头,哪个摄像头是打开的等等
        THREAD_POOL_EXECUTOR.execute(mOncreateCameraController);
        
        //创建DataModuleManager对象,用于处理相机设置相关的数据
        THREAD_POOL_EXECUTOR.execute(mOnCreateDataSetting);

        // open camera task
        //打开摄像头的请求,先请求各种权限,然后调用cameraController的requestCamera方法,
        //接着调用的是checkAndOpenCamera,实际调用的是cameraAgent的opencamera,有一个cameraopen的callback
        THREAD_POOL_EXECUTOR.execute(mOncreateOpencamera);

        // other task
        //向datamoduleCamera  datacamera通用设置数据,写入一些初始参数
        //展锐平台的相机参数是通过dateModule进行管理的,分为三类:DataModuleCamera、DataModulePhoto和DataModuleVideo
        THREAD_POOL_EXECUTOR.execute(mOncreateOtherTaskInOncreateProcess);

        //注册一些广播,获取电池状态,保存相机状态等等操作
        THREAD_POOL_EXECUTOR.execute(mOncreateOtherTask);

        //判断是否使用Google photos(耗时操作)
        THREAD_POOL_EXECUTOR.execute(mUsedGooglePhotos);

        //照片和视频数据是否发生变化,刷新缩率图的显示
        mOnCreateAsyncHandler.post(mLoadFilmStrip);

        //设置布局
        setContentView(R.layout.dream_main);
        
        //初始化(其中有进行初始化cameraappUI的操作)
        postInit();
        // after setcontent view & initialize cameraAPPUI, load the stub view & add view
    }

CameraActivity.preInit()

private void preInit() {
   
   
        shutdown = false;
        mAppContext = getApplicationContext();
        //获取主线程的manager
        mMainHandler = new MainHandler(this, getMainLooper());

       //异常的handler,用于初始化处理异常时调用
        mFatalErrorHandler = new FatalErrorHandlerImpl(CameraActivity.this);
        ...

        //检查是否是安全模式启动相机(锁屏启动)
        // Check if this is in the secure camera mode.
        Intent intent = getIntent();
        String action = intent.getAction();
        if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)
                || ACTION_IMAGE_CAPTURE_SECURE.equals(action)) {
   
   
            mSecureCamera = true;
        } else {
   
   
            mSecureCamera = intent.getBooleanExtra(SECURE_CAMERA_EXTRA , false);
        }
        ....
        //相机是否Available的数据结构对象初始化,存放所有摄像头是否available的map
        mCameraAvailableMap = new ConcurrentHashMap<String, Boolean>();

        //检查是否由Google助手启动相机
        if (MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA.equals(action)){
   
   
            String ref = intent.getStringExtra(INTENT_EXTRA_REFERRER_NAME);
            if (!isVoiceInteractionRoot() && (ref == null 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值