今天来分析下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