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