mtk-t-6761 前后摄切换上层分析

onCameraSelected
/alps/vendor/mediatek/proprietary/packages/apps/Camera2/host/src/com/mediatek/camera/CameraActivity.java

    @Override
    protected void onCreateTasks(Bundle savedInstanceState) {
      //是否开启横屏
        if (com.mediatek.camera.portability.SystemProperties.getInt("vendor.mtk.camera.app.platform.landscape", 0) == 1) {
            LogHelper.d(TAG, "[onCreateTasks] SCREEN_ORIENTATION_LANDSCAPE");
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        CameraSysTrace.onEventSystrace("CameraActivity.onCreateTasks", true, true);
        if (ActivityManager.isUserAMonkey()) {
            LogHelper.d(TAG, "[onCreateTasks] from Monkey");
            invalidateOptionsMenu();
        }
        //不是第三方拉起且不是第前摄
        if (!isThirdPartyIntent(this) && !isOpenFront(this)) {
            CameraUtil.launchCamera(this);
        }
        IPerformanceProfile profile = PerformanceTracker.create(TAG, "onCreate").start();
        super.onCreateTasks(savedInstanceState);
        //if (CameraUtil.isTablet() || WifiDisplayStatusEx.isWfdEnabled(this)) {
        //  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
        //  setRequestedOrientation(CameraUtil.calculateCurrentScreenOrientation(this));
        //}
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_LAYOUT_FLAGS
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        CameraSysTrace.onEventSystrace("onCreateTasks.setContentView", true, true);
        setContentView(R.layout.activity_main);
        CameraSysTrace.onEventSystrace("onCreateTasks.setContentView", false, true);
        mOrientationListener = new OrientationEventListenerImpl(this);
        //create common ui module.
        //初始化APPUI
        mCameraAppUI = new CameraAppUI(this);
        profile.mark("CameraAppUI initialized.");
        CameraSysTrace.onEventSystrace("onCreateTasks.CameraAppUIInit", true);
        mCameraAppUI.onCreate();
        CameraSysTrace.onEventSystrace("onCreateTasks.CameraAppUIInit", false);
        profile.mark("CameraAppUI.onCreate done.");
        //模式监听(模式的切换)
        mIModeListener = new ModeManager();
        mIModeListener.create(this);
        profile.mark("ModeManager.create done.");
        profile.stop();
        CameraSysTrace.onEventSystrace("CameraActivity.onCreateTasks", false, true);
    }

点击前后摄切换的代码逻辑如下

alps/vendor/mediatek/proprietary/packages/apps/Camera2/feature/setting/cameraswitcher/src/com/mediatek/camera/feature/setting/CameraSwitcher.java

    private View initView() {
        Activity activity = mApp.getActivity();
        View switcher = activity.getLayoutInflater().inflate(R.layout.camera_switcher, null);
        switcher.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (SystemProperties.getInt(SWITCH_CAMERA_DEBUG_PROPERTY, 0) == 1) {
                    LogHelper.d(TAG, "[onClick], enter debug mode.");
                    switchCameraInDebugMode();
                } else if (SystemProperties.getInt(DEBUG_MAIN2, 0) == 1) {
                    LogHelper.d(TAG, "[onClick], enter main2 debug mode.");
                    switchCameraInDebugMain2();
                } else {
                    LogHelper.d(TAG, "[onClick], enter camera normal mode.");
                    //正常切换
                    switchCameraInNormal();
                }
            }
        });
        switcher.setContentDescription(mFacing);
        return switcher;
    }

    private void switchCameraInNormal() {
        String nextFacing = mFacing.equals(CAMERA_FACING_BACK) ? CAMERA_FACING_FRONT
                : CAMERA_FACING_BACK;
        LogHelper.d(TAG, "[switchCameraInNormal], switch camera to " + nextFacing);
        、、、
        boolean success = mApp.notifyCameraSelected(newCameraId);
        if (success) {
            LogHelper.d(TAG, "[switchCameraInNormal], switch camera success.");
            mFacing = nextFacing;
            mDataStore.setValue(KEY_CAMERA_SWITCHER, mFacing,
                    getStoreScope(), true);
        }
        mSwitcherView.setContentDescription(mFacing);
    }
    

具体触发日志如下

01-03 08:04:55.230  8374  8374 D CamAp_CameraSwitcher: [onClick], enter camera normal mode.
01-03 08:04:55.230  8374  8374 D CamAp_CameraSwitcher: [switchCameraInNormal], switch camera to back
public class ModeManager implements IModeListener, IAppUiListener.OnModeChangeListener {
    

点击前后摄切换触发

    @Override
    public boolean onCameraSelected(@Nonnull String cameraFacing) {
        LogHelper.i(TAG, "[onCameraSelected], switch to camera:" + cameraFacing);

        // Disable ui immediately when switch camera.
        mAppUi.applyAllUIEnabled(false);
        Message msg = mModeHandler.obtainMessage(MSG_MODE_ON_CAMERA_SELECTED,
                new MsgParam(mNewMode, cameraFacing));
        mAtomAccessor.sendAtomMessageAndWait(mModeHandler, msg);
        return mSelectedResult;
    }

具体触发日志如下

01-03 08:04:55.236  8374  8374 I CamAp_ModeManager: [onCameraSelected], switch to camera:0

然后是photoMode

    @Override
    public boolean onCameraSelected(@Nonnull String newCameraId) {
        LogHelper.i(TAG, "[onCameraSelected] ,new id:" + newCameraId + ",current id:" + mCameraId);
        super.onCameraSelected(newCameraId);
        //first need check whether can switch camera or not.
        if (canSelectCamera(newCameraId)) {
            doCameraSelect(mCameraId, newCameraId);
            return true;
        } else {
            return false;
        }
    }
   
01-03 08:04:55.238  8374  8613 I CamAp_PhotoMode: [onCameraSelected] ,new id:0,current id:1
01-03 08:04:55.238  8374  8613 D CamAp_PhotoMode: [canSelectCamera] +: true

先closeCamera prePareAndCloseCamera(true, oldCamera);

    private void doCameraSelect(String oldCamera, String newCamera) {
        mIApp.getAppUi().applyAllUIEnabled(false);
        mIApp.getAppUi().onCameraSelected(newCamera);
        //关闭camera
        prePareAndCloseCamera(true, oldCamera);
        recycleSettingManager(oldCamera);
        initSettingManager(newCamera);
        //打开camera
        prepareAndOpenCamera(false, newCamera, true);
    }

同步关闭camera

    private void prePareAndCloseCamera(boolean needSync, String cameraId) {
        clearAllCallbacks(cameraId);
        mIDeviceController.closeCamera(needSync);
        mIsMatrixDisplayShow = false;
        //reset the preview size
        mPreviewWidth = 0;
        mPreviewHeight = 0;
    }

alps/vendor/mediatek/proprietary/packages/apps/Camera2/common/src/com/mediatek/camera/common/mode/photo/device/PhotoDevice2Controller.java

    @Override
    public void closeCamera(boolean sync) {
        synchronized (CameraApplication.class) {
            LogHelper.i(TAG, "[closeCamera] + sync = " + sync + " current state : " + mCameraState);
            CameraSysTrace.onEventSystrace("photoDevice.closeCamera", true, true);
            if (CameraState.CAMERA_UNKNOWN != mCameraState) {
                try {
                    mDeviceLock.tryLock(WAIT_TIME, TimeUnit.SECONDS);
                    super.doCameraClosed(mCamera2Proxy);
                    updateCameraState(CameraState.CAMERA_CLOSING);
                    abortOldSession();
                    if (mModeDeviceCallback != null) {
                        mModeDeviceCallback.beforeCloseCamera();
                    }
                    LogHelper.d(TAG, "[closeCamera] doCloseCamera(sync) +");
                    //关闭camera流程
                    doCloseCamera(sync);
                    LogHelper.d(TAG, "[closeCamera] doCloseCamera(sync) -");
                    updateCameraState(CameraState.CAMERA_UNKNOWN);
                    recycleVariables();
                    releaseJpegCaptureSurface();
                    mThumbnailSurface.releaseCaptureSurface();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    super.doCameraClosed(mCamera2Proxy);
                    mDeviceLock.unlock();
                }
                recycleVariables();
            }
            mCurrentCameraId = null;
            CameraSysTrace.onEventSystrace("photoDevice.closeCamera", false, true);
            LogHelper.i(TAG, "[closeCamera] -");
        }
    }

    private void doCloseCamera(boolean sync) {
        if (sync) {
                mCameraDeviceManager.closeSync(mCurrentCameraId);
        } else {
                mCameraDeviceManager.close(mCurrentCameraId);
        }
        mCamera2Proxy = null;
        synchronized (mSurfaceHolderSync) {
            mSurfaceObject = null;
            mPreviewSurface = null;
        }
    }

日志

01-03 08:04:55.239  8374  8613 I CamAp_PhotoDevice2Controller: [closeCamera] + sync = true current state : CAMERA_OPENED
01-03 08:04:55.239  8374  8613 D CamAp_PhotoDevice2Controller: [updateCameraState] new state = CAMERA_CLOSING old =CAMERA_OPENED
01-03 08:04:55.326  8374  8613 D CamAp_PhotoDevice2Controller: [closeCamera] doCloseCamera(sync) +
01-03 08:04:55.327  8374  8739 D CamAp_DeviceMgr2: handle close camera msg +
01-03 08:04:55.409  8374  8739 D CamAp_DeviceMgr2: handle close camera msg -
01-03 08:04:55.409  8374  8613 D CamAp_PhotoDevice2Controller: [closeCamera] doCloseCamera(sync) -
01-03 08:04:55.410  8374  8613 D CamAp_PhotoDevice2Controller: [updatePreviewSurface] surfaceHolder = null state = CAMERA_UNKNOWN, session :null, mNeedSubSectionInitSetting:true
01-03 08:04:55.410  8374  8613 I CamAp_PhotoDevice2Controller: [closeCamera] -

然后走打开摄像头

    private void prepareAndOpenCamera(boolean needOpenCameraSync, String cameraId,
            boolean needFastStartPreview) {
        mCameraId = cameraId;
        StatusMonitor statusMonitor = mICameraContext.getStatusMonitor(mCameraId);
        statusMonitor.registerValueChangedListener(KEY_PICTURE_SIZE, mStatusChangeListener);
        statusMonitor.registerValueChangedListener(KEY_FORMTAT, mStatusChangeListener);
        statusMonitor.registerValueChangedListener(KEY_MATRIX_DISPLAY_SHOW, mStatusChangeListener);

        //before open camera, prepare the device callback and size changed callback.
        mIDeviceController.setDeviceCallback(this);
        mIDeviceController.setPreviewSizeReadyCallback(this);
        mIDeviceController.setSavedDataCallback(this);
        //prepare device info.
        DeviceInfo info = new DeviceInfo();
        info.setCameraId(mCameraId);
        info.setSettingManager(mISettingManager);
        info.setNeedOpenCameraSync(needOpenCameraSync);
        info.setNeedFastStartPreview(needFastStartPreview);
        mIDeviceController.openCamera(info);
    }

01-03 08:04:55.421  8374  8613 I CamAp_PhotoDevice2Controller: [openCamera] cameraId : 0,sync = false
01-03 08:04:55.421  8374  8613 I CamAp_PhotoDevice2Controller: [canOpenCamera] new id: 0 current camera :null isSameCamera = false current state : CAMERA_UNKNOWN isStateReady = true can open : true
01-03 08:04:55.421  8374  8613 D CamAp_PhotoDevice2Controller: [updateCameraState] new state = CAMERA_OPENING old =CAMERA_UNKNOWN

01-03 08:04:55.444  8374  8613 I CamAp_PhotoDevice2Controller: [onOpened]  camera2proxy = com.mediatek.camera.common.device.v2.Camera2Proxy@8824113 preview surface = null  mCameraState = CAMERA_OPENINGcamera2Proxy id = 0 mCameraId = 0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值