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() {

2.打开相机


神经蛙
1 声望0 粉丝