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 (!isVoiceInteract
### Android Camera 组件启动流程详解 #### 1. 系统初始化阶段 在Linux内核启动之后,Android系统会进入用户空间并执行`init`进程。此进程中包含了多个重要步骤用于启动各种必要的守护进程和服务。对于Camera模块而言,其依赖的服务会在这一时期被创建和配置[^4]。 #### 2. Service Manager 启动 CameraService 当Zygote孵化完毕后,SystemServer开始运行,并负责加载核心应用框架以及启动关键性的后台服务。其中包括了CameraService的实例化与注册到ServiceManager中去。这一步骤确保了后续其他组件能够通过Binder机制访问Camera HAL层所提供的能力[^1]。 #### 3. 应用程序请求开启摄像头 开发者通常利用 `CameraManager` 类来获取有关可用摄像机的信息及其状态变化通知。具体来说就是调用了如下所示的方法: ```java CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); ``` 这段代码的作用是从系统的service manager那里取得camera service的一个代理对象,从而可以进一步操作具体的相机设备[^2]。 #### 4. 打开指定ID的物理相机设备 一旦获得了CameraManager实例,就可以尝试打开特定编号的相机单元。这里涉及到的实际API调用可能是这样的形式: ```java public static Camera openCamera(int cameraId) { try{ return Camera.open(cameraId); } catch(Exception e){ Log.e("OpenCameraError", "Failed to open camera with id:" + String.valueOf(cameraId)); return null; } } ``` 上述方法内部实现了对底层硬件抽象层(HAL)接口的调用逻辑,最终实现的是向驱动发送指令以激活相应的图像传感器和其他关联部件[^3]。 #### 5. 完成CameraSession建立 成功打开了目标相机之后,则进入了设置参数、预览流构建等一系列准备工作当中。此时已经建立了完整的从上至下的通信链路——即由Java API经JNI到达native库再到底层HAL直至实际的硬件控制层面;同时也意味着应用程序现在拥有了对该相机资源的有效使用权直到显式释放为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值