1.程序入口
任何一个活动都是需要在AndroidManifest.xml中注册的,通过该xml文件中的<intent-filter>内容可确认主活动,从而找到程序入口。
packages/apps/Camera2/AndroidManifest.xml
<application
android:name="com.android.camera.app.CameraApp" ... >
<activity
android:name="com.android.camera.CameraActivity" ... />
</activity>
...
<activity-alias
android:name="com.android.camera.CameraLauncher"
android:label="@string/app_name"
android:targetActivity="com.android.camera.CameraActivity">
//>>1.1 由intent-filter标签里的“MAIN"和"LAUNCHER"说明CameraActivity是主活动,所以程序入口为CameraActivity.java中的onCreate()方法
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
packages/apps/Camera2/src/com/android/camera/CameraActivity.java
中onCreate相关代码如下:
@Override
public void onCreateTasks(Bundle state) {
Profile profile = mProfiler.create("CameraActivity.onCreateTasks").start();
CameraPerformanceTracker.onEvent(CameraPerformanceTracker.ACTIVITY_START);
...
//>>1.2 分别在OneCameraModule.java和Camera2OneCameraOpenerImpl.java中完成对mOneCameraOpener和mOneCameraManager对象的初始化。从命名可见,mOneCameraOpener用来manage打开相机,mOneCameraManager用来manage打开的相机。
try {
mOneCameraOpener = OneCameraModule.provideOneCameraOpener(
mFeatureConfig,
mAppContext,
mActiveCameraDeviceTracker,
ResolutionUtil.getDisplayMetrics(this));
mOneCameraManager = OneCameraModule.provideOneCameraManager();
} catch (OneCameraException e) {
// Log error and continue start process while showing error dialog..
Log.e(TAG, "Creating camera manager failed.", e);
mFatalErrorHandler.onGenericCameraAccessFailure();
}
...
//>>1.3 进行一系列模块注册,如:Photo、Video、广角、Sphere等,由log可见注册成CaptureModule(代表相机)
ModulesInfo.setupModules(mAppContext, mModuleManager, mFeatureConfig);
...
//>>1.4 CameraModule初始化 mCurrentModule是CameraModule类的对象,由上,下面代码对应CaptureModule.java的init()
mCurrentModule.init(this, isSecureCamera(), isCaptureIntent());
CaptureModule的init()中注册了对已打开的相机设备预览状态的监听:
src/com/android/camera/CaptureModule.java
private void reopenCamera() {
AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
@Override
public void run() {
closeCamera();
if(!mAppController.isPaused()) {
openCameraAndStartPreview();
}
}
});
}
private final PreviewStatusListener mPreviewStatusListener = new PreviewStatusListener() {
...
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
...
reopenCamera();
}
...
}
public void init(CameraActivity activity, boolean isSecureCamera, boolean isCaptureIntent) {
...
HandlerThread thread = new HandlerThread("CaptureModule.mCameraHandler");
thread.start();
mCameraHandler = new Handler(thread.getLooper());
mOneCameraOpener = mAppController.getCameraOpener();
...
mAppController.setPreviewStatusListener(mPreviewStatusListener);
...
}
当SurfaceTexture状态变为可调用时,调用reopenCamera()从而打开相机,反之closeCamera()关闭相机。reopenCamera()中,(1)closeCamera()->(2)openCameraAndStartPreview()。
其中在openCameraAndStartPreview中获得cameraID并调用open接口打开该ID的相机,打开成功后回调onCameraOpened()。
private void openCameraAndStartPreview() {
...
mOneCameraOpener.open(cameraId, captureSetting, mCameraHandler, mainThread,
imageRotationCalculator, mBurstController, mSoundPlayer,
new OpenCallback() {
@Override
public void onCameraOpened(@Nonnull final OneCamera camera) {
...
camera.startPreview(new Surface(getPreviewSurfaceTexture()),
@Override
public void onReadyForCapture() {
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。