private boolean mAwbLockSupported;
private boolean mContinuousFocusSupported;
+ /*
+ * If true, attempts to start the preview will be denied. This ensures that
+ * we never call startPreview multiple times when making changes to
+ * settings.
+ */
+ private boolean mStartPreviewLock = false;
+
// The degrees of the device rotated clockwise from its natural orientation.
private int mOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
// Do camera parameter dependent initialization.
mCameraSettings = mCameraDevice.getSettings();
- setCameraParameters(UPDATE_PARAM_ALL);
- // Set a listener which updates camera parameters based
- // on changed settings.
- SettingsManager settingsManager = mActivity.getSettingsManager();
- settingsManager.addListener(this);
- mCameraPreviewParamsReady = true;
+ // HACK: The call to setCameraParameters(UPDATE_PARAM_ALL) may
+ // eventually recurse back into startPreview().
+ // To avoid calling startPreview() twice, first acquire
+ // mStartPreviewLock.
+ mStartPreviewLock = true;
+ try {
+ setCameraParameters(UPDATE_PARAM_ALL);
+ // Set a listener which updates camera parameters based
+ // on changed settings.
+ SettingsManager settingsManager = mActivity.getSettingsManager();
+ settingsManager.addListener(this);
+ mCameraPreviewParamsReady = true;
+ } finally {
+ mStartPreviewLock = false;
+ }
startPreview();
* The start/stop preview should only run on the UI thread.
*/
private void startPreview() {
- if (!checkPreviewPreconditions()) {
+ // HACK: The call to setCameraParameters(UPDATE_PARAM_ALL) may
+ // eventually recurse back into startPreview().
+ // To avoid calling startPreview() twice, we must acquire
+ // mStartPreviewLock.
+ if (mStartPreviewLock) {
+ // do nothing
return;
}
+ mStartPreviewLock = true;
+ try {
+ if (!checkPreviewPreconditions()) {
+ return;
+ }
- mCameraDevice.setErrorCallback(mHandler, mErrorCallback);
- setDisplayOrientation();
+ mCameraDevice.setErrorCallback(mHandler, mErrorCallback);
+ setDisplayOrientation();
- if (!mSnapshotOnIdle) {
- // If the focus mode is continuous autofocus, call cancelAutoFocus
- // to resume it because it may have been paused by autoFocus call.
- if (mFocusManager.getFocusMode(mCameraSettings.getCurrentFocusMode()) ==
- CameraCapabilities.FocusMode.CONTINUOUS_PICTURE) {
- mCameraDevice.cancelAutoFocus();
+ if (!mSnapshotOnIdle) {
+ // If the focus mode is continuous autofocus, call cancelAutoFocus
+ // to resume it because it may have been paused by autoFocus call.
+ if (mFocusManager.getFocusMode(mCameraSettings.getCurrentFocusMode()) ==
+ CameraCapabilities.FocusMode.CONTINUOUS_PICTURE) {
+ mCameraDevice.cancelAutoFocus();
+ }
+ mFocusManager.setAeAwbLock(false); // Unlock AE and AWB.
}
- mFocusManager.setAeAwbLock(false); // Unlock AE and AWB.
- }
- setCameraParameters(UPDATE_PARAM_ALL);
- mCameraDevice.setPreviewTexture(mActivity.getCameraAppUI().getSurfaceTexture());
+ setCameraParameters(UPDATE_PARAM_ALL);
+ mCameraDevice.setPreviewTexture(mActivity.getCameraAppUI().getSurfaceTexture());
- Log.i(TAG, "startPreview");
- mCameraDevice.startPreview();
+ Log.i(TAG, "startPreview");
+ mCameraDevice.startPreview();
- mFocusManager.onPreviewStarted();
- onPreviewStarted();
- SessionStatsCollector.instance().previewActive(true);
- if (mSnapshotOnIdle) {
- mHandler.post(mDoSnapRunnable);
+ mFocusManager.onPreviewStarted();
+ onPreviewStarted();
+ SessionStatsCollector.instance().previewActive(true);
+ if (mSnapshotOnIdle) {
+ mHandler.post(mDoSnapRunnable);
+ }
+ } finally {
+ mStartPreviewLock = false;
}
}
import com.android.camera.CameraDisabledException;
import com.android.camera.debug.Log;
import com.android.camera.util.CameraUtil;
+import com.android.camera.util.GservicesHelper;
import com.android.ex.camera2.portability.CameraAgent;
import com.android.ex.camera2.portability.CameraAgent.CameraExceptionCallback;
import com.android.ex.camera2.portability.CameraDeviceInfo;
// No camera yet.
checkAndOpenCamera(mContext, cameraManager, id, mCallbackHandler, this);
} else if (mCameraProxy.getCameraId() != id || mUsingNewApi != useNewApi) {
+ boolean syncClose = GservicesHelper.useCamera2ApiThroughPortabilityLayer(mContext);
Log.v(TAG, "different camera already opened, closing then reopening");
// Already has camera opened, and is switching cameras and/or APIs.
if (mUsingNewApi) {
- mCameraAgentNg.closeCamera(mCameraProxy, false);
+ mCameraAgentNg.closeCamera(mCameraProxy, true);
} else {
- mCameraAgent.closeCamera(mCameraProxy, false);
+ // if using API2 ensure API1 usage is also synced
+ mCameraAgent.closeCamera(mCameraProxy, syncClose);
}
checkAndOpenCamera(mContext, cameraManager, id, mCallbackHandler, this);
} else {