重构原生camera2 有3个月了,现在也算告一段落,这里总结一些原生APK流程以做记录。
camera2的所有主要操作都在一个activity中进行,那就是CameraActivity.java,所以现在先onCreate开始说起,由于我们现在主要讲启动流程,所以将与主流程无关的代码和UI界面相关的复杂代码删除,以便阅读。
CameraActivity.java
public void onCreate(Bundle state) {
CameraPerformanceTracker.onEvent(CameraPerformanceTracker.ACTIVITY_START);
super.onCreate(state);
if (!Glide.isSetup()) {
Glide.setup(new GlideBuilder(this)
.setResizeService(new FifoPriorityThreadPoolExecutor(1)));
Glide.get(this).setMemoryCategory(MemoryCategory.HIGH);
}
mOnCreateTime = System.currentTimeMillis();
mAppContext = getApplicationContext();
mSoundPlayer = new SoundPlayer(mAppContext);
//获取cameramanager,在CaptureModule中使用,但是我们拍照用的是PhotoModule所以暂时无用
mCameraManager = OneCameraManager.get(this);
// TODO: Try to move all the resources allocation to happen as soon as
// possible so we can call module.init() at the earliest time.
mModuleManager = new ModuleManagerImpl();
GcamHelper.init(getContentResolver());
//初始化Modules,这里Module的作用相当于MVC模式中M的作用,它对camera进行操作。
ModulesInfo.setupModules(mAppContext, mModuleManager);
//SettingsManager保存camera配置
mSettingsManager = getServices().getSettingsManager();
AppUpgrader appUpgrader = new AppUpgrader(this);
appUpgrader.upgrade(mSettingsManager);
Keys.setDefaults(mSettingsManager, mAppContext);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);
mActionBar = getActionBar();
// set actionbar background to 100% or 50% transparent
if (ApiHelper.isLOrHigher()) {
mActionBar.setBackgroundDrawable(new ColorDrawable(0x00000000));
} else {
mActionBar.setBackgroundDrawable(new ColorDrawable(0x80000000));
}
mActionBar.addOnMenuVisibilityListener(mOnMenuVisibilityListener);
mMainHandler = new MainHandler(this, getMainLooper());
//创建camera的controll对象,通过CameraController来对framework的API接口进行控制,现在camera有2套API机制可以在CameraAgentFactory中看到,后续再进行说明。
mCameraController = new CameraController(mAppContext, this, mMainHandler,
CameraAgentFactory.getAndroidCameraAgent(this, CameraAgentFactory.CameraApi.API_1),
CameraAgentFactory.getAndroidCameraAgent(this, CameraAgentFactory.CameraApi.AUTO));
mCameraController.setCameraDefaultExceptionCallback(mCameraDefaultExceptionCallback,
mMainHandler);
.........
//CameraAppUI来绘制camera总UI,不同module的UI在对应的module内再绘制,比如photomodule的ui由PhotoUI绘制
mCameraAppUI = new CameraAppUI(this,
(MainActivityLayout) findViewById(R.id.activity_root_view), isCaptureIntent());
.........
//设置当前module
setModuleFromModeIndex(getModeIndex());
//初始化UI
mCameraAppUI.prepareModuleUI();
//初始化当前Module
mCurrentModule.init(this, isSecureCamera(), isCaptureIntent());
.........
}
//这样oncreate完成,接下来看onStart,我们拍照界面用的是PhotoModule,所以后面module都用PhotoModule为列
public void onStart() {
super.onStart();
mIsActivityRunning = true;
mPanoramaViewHelper.onStart();
//获取当前所用moduleID
int modeIndex = getModeIndex();
if (!isCaptureIntent() && mCurrentModeIndex != modeIndex) {
//切换modeIndex所代表的module
onModeSelected(modeIndex);
}
if (mResetToPreviewOnResume) {
mCameraAppUI.resume();
mResetToPreviewOnResume = false;
}
}
public void onModeSelected(int modeIndex) {
if (mCurrentModeIndex == modeIndex) {
return;
}
CameraPerformanceTracker.onEvent(CameraPerformanceTracker.MODE_SWITCH_START);
// Record last used camera mode for quick switching
if (modeIndex == getResources().getInteger(R.integer.camera_mode_photo)
|| modeIndex == getResources().getInteger(R.integer.camera_mode_gcam)) {
mSettingsManager.set(SettingsManager.SCOPE_GLOBAL,