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

今天来分析下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
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录: 结构如下,非常详细 第1章 android系统概述 1 1.1 基础知识 1 1.1.1 android开发系统的由来 1 1.1.2 移动电话系统开发模式 2 1.1.3 未来移动电话的功能及android的优势 4 1.2 android的开发工作 6 1.2.1 android移植开发 6 1.2.2 android应用开发 8 1.2.3 android系统开发 9 1.3 android的sdk与源代码 10 1.3.1 基于sdk的android开发 10 1.3.2 基于源代码sdk android开发 11 第2章 android系统开发综述 13 2.1 android的系统架构 13 2.1.1 软件结构 13 2.1.2 android的工具 16 2.2 android源代码的开发环境 18 2.2.1 android源代码的获取和提交 18 2.2.2 android源代码结构 21 2.2.3 编译 24 .2.2.4 系统的运行 25 2.3 android sdk的开发环境 32 2.3.1 sdk的结构 32 2.3.2 windows环境sdk开发 33 2.3.3 linux环境sdk开发 42 第3章 android的linux内核与驱动程序 44 3.1 linux核心与驱动 44 3.2 android专用驱动 45 3.2.1 ashmem 45 3.2.2 binder 45 3.2.3 logger 46 3.3 android使用的设备驱动 46 3.3.1 framebuffer显示驱动 46 3.3.2 event输入设备驱动 48 3.3.3 v4l2摄像头——视频驱动 50 3.3.4 oss音频驱动 53 3.3.5 alsa音频驱动 54 3.3.6 mtd驱动 56 3.3.7 蓝牙驱动 57 3.3.8 wlan驱动 58 第4章 android的底层库和程序 60 4.1 底层库和程序的结构 60 4.1.1 本地实现的基本结构 60 4.1.2 增加本地程序和库的方法 61 4.2 标准c/c++库bionic 64 4.3 c语言工具库libcutils 65 4.4 init可执行程序 66 4.5 shell工具 72 4.6 c++工具库libutils 75 4.6.1 libutils的基本内容 75 4.6.2 binder 76 4.6.3 libutils中的其他内容 82 4.7 android的系统进程 85 4.7.1 servicemanager 85 4.7.2 zygote 87 第5章 android的java虚拟机和java环境 88 5.1 dalvik虚拟机和核心库 88 5.1.1 dex工具库和虚拟机的实现 89 5.1.2 核心库 90 5.1.3 nativehelper库 91 5.2 android的java程序环境 91 5.2.1 java类的层次结构 91 5.2.2 android java类的代码 92 5.2.3 android系统api 92 5.3 jni的使用 96 5.3.1 jni的架构和实现方式 97 5.3.2 jni的实现方式 97 5.3.3 在应用程序中使用jni 99 5.4 系统服务的java部分 101 5.4.1 binder 102 5.4.2 servicemanager 103 5.4.3 系统进程 103 第6章 android的gui系统 106 6.1 android gui系统综述 106 6.2 pixelflinger和libui库 108 6.2.1 pixelflinger 108 6.2.2 libui 108 6.2.3 输出/输入与硬件的接口 109 6.3 surface系统 113 6.3.1 surface系统本地接口 113 6.3.2 surfaceflinger本地代码 115 6.3.3 surface的java和jni代码 119 6.4 skia和2d图形系统 121 6.4.1 skia底层库 121 6.4.2 android图形系统的jni接口 124 6.4.3 android的图形包(graphics) 125 6.5 android的opengl系统与3d图形系统 125 6.5.1 opengl的本地代码 125 6.5.2 opengl的jni代码 130 6.5.3 opengl的java类 130 第7章 android的audio系统 132 7.1 audio系统综述 132 7.2 audio系统和上层接口 134 7.2.1 audio系统的各个层次 134 7.2.2 media库
Camera HAL的启动流程主要分为以下几个步骤。 首先,上层应用通过调用CameraManager的openCamera方法来请求打开相机。这个方法会调用CameraManagerService中的openCamera方法,并传递相应的参数。 接着,CameraManagerService会查找相应的硬件相机模块,使用hw_get_module函数来获取相机模块的实例。这个函数会根据设备配置文件中的相机模块信息来加载相应的动态库,并返回相机模块的实例。 然后,CameraManagerService会通过getCameraInfo方法获取相机的详细信息,包括相机的ID、方向和镜像设置等。 接下来,CameraManagerService会调用相机模块的open方法来打开相机设备。相机模块会根据具体硬件实现来进行相机设备的初始化工作。 在相机设备打开成功后,CameraManagerService会创建一个CameraDevice实例,并将其返回给上层应用。 最后,上层应用可以通过CameraDevice实例来进行相机的操作,例如拍照、录像等。 总之,Camera HAL的启动流程包括应用调用CameraManager的openCamera方法、CameraManagerService查找相机模块、相机模块的初始化和相机设备的打开。通过这些步骤,上层应用可以获取到一个可用的相机设备,并进行相关的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Camera打开流程](https://download.csdn.net/download/sinat_21855227/9483107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Android 13 Camera HAL启动流程(1)](https://blog.csdn.net/weixin_41678668/article/details/130958729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Android 13 Camera HAL启动流程(2)](https://blog.csdn.net/weixin_41678668/article/details/130997399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值