在文章android源码分析之Camera API2.0简介中,对Camera API2.0的框架以及代码做了简单介绍,本文将基于android6.0源码,分析Camera API2.0下的Camera2内置应用中,对Camera的初始化的流程分析,主要涉及Camera HAL3.0,Java 层的IPC Binder,Native层的CameraService的C/S服务架构等关键点。
Camera2相关分析文章目录:
android6.0源码分析之Camera API2.0简介
android6.0源码分析之Camera2 HAL分析
android6.0源码分析之Camera API2.0下的初始化流程分析
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析
android6.0源码分析之Camera API2.0下的Capture流程分析
android6.0源码分析之Camera API2.0下的video流程分析
Camera API2.0的应用
1、Camera2初始化的应用层流程分析
Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程。Camera2.0首先启动的是CameraActivity,而它继承自QuickActivity,在代码中你会发现没有重写OnCreate等生命周期方法,因为此处采用的是模板方法的设计模式,在QuickActivity中的onCreate方法调用的是onCreateTasks等方法,所以要看onCreate方法就只须看onCreateTasks方法即可:
//CameraActivity.java
@Override
public void onCreateTasks(Bundle state) {
Profile profile = mProfiler.create("CameraActivity.onCreateTasks")
.start();
...
mOnCreateTime = System.currentTimeMillis();
mAppContext = getApplicationContext();
mMainHandler = new MainHandler(this, getMainLooper());
…
try {
//初始化OneCameraOpener对象
①mOneCameraOpener = OneCameraModule.provideOneCameraOpener(
mFeatureConfig, mAppContext,mActiveCameraDeviceTracker,
ResolutionUtil.getDisplayMetrics(this));
mOneCameraManager = OneCameraModule.provideOneCameraManager();
} catch (OneCameraException e) {
...}
…
//建立模块信息
②ModulesInfo.setupModules(mAppContext, mModuleManager, mFeatureConfig);
…
//进行初始化
③mCurrentModule.init(this, isSecureCamera(), isCaptureIntent());
…
}
如代码所示,重要的有以上三点,先看第一点:
//OneCameraModule.java
public static OneCameraOpener provideOneCameraOpener(OneCameraFeatureConfig
featureConfig, Context context, ActiveCameraDeviceTracker
activeCameraDeviceTracker,DisplayMetrics displayMetrics)
throws OneCameraException {
//创建OneCameraOpener对象
Optional<OneCameraOpener> manager = Camera2OneCameraOpenerImpl.create(
featureConfig, context, activeCameraDeviceTracker, displayMetrics);
if (!manager.isPresent()) {
manager = LegacyOneCameraOpenerImpl.create();
}
...
return manager.get();
}
它调用Camera2OneCameraOpenerImpl的create方法来获得一个OneCameraOpener对象,以供CameraActivity之后的操作使用,继续看create方法:
//Camera2OneCameraOpenerImpl.java
public static Optional<OneCameraOpener> create(OneCameraFeatureConfig
featureConfig, Context context, ActiveCameraDeviceTracker
activeCameraDeviceTracker, DisplayMetrics displayMetrics) {
...
CameraManager cameraManager;
try {
cameraManager = AndroidServices.instance().provideCameraManager();
} catch (IllegalStateException ex) {
...}
//新建一个Camera2OneCameraOpenerImpl对象
OneCameraOpener oneCameraOpener = new Camera2OneCameraOpenerImpl(
featureConfig, context, cameraManager,
activeCameraDeviceTracker, displayMetrics);
return Optional.of(oneCameraOpener);
}
很明显,它首先获取一个cameraManger对象,然后根据这个cameraManager对象来新创建了一个Camera2OneCameraOpenerImpl对象,所以第一步主要是为了获取一个OneCameraOpener对象,它的实现为Camera2OneCameraOpenerImpl类。
继续看第二步,ModulesInfo.setupModules:
// ModulesInfo.java
public static void setupModules(Context context, ModuleManager moduleManager,
OneCameraFeatureConfig config) {
Resources res = context.getResources();
int photoModuleId = 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));
}
int imageCaptureIntentModuleId = res.getInteger(
R.integer.camera_mode_capture_intent);
registerCaptureIntentModule(moduleManager,
imageCaptureIntentModuleId,SettingsScopeNamespaces.PHOTO,
config.isUsingCaptureModule());
}
代码根据配置信息,进行一系列模块的注册,其中PhotoModule和VideoModule被注册,而其他的module则是根据配置来进行的,因为打开Camera应用,既可以拍照片也可以拍视频,此处,只分析PhoneModule的注册:
// ModulesInfo.java