package com.android.camera;
-import static com.android.camera.Util.Assert;
-
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters;
-import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
-import com.android.camera.CameraManager.CameraProxy;
+import com.android.camera.app.CameraManager;
+import com.android.camera.app.CameraManager.CameraProxy;
+import com.android.camera.app.CameraManagerFactory;
-import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
+import static com.android.camera.util.CameraUtil.Assert;
+
/**
* The class is used to hold an {@code android.hardware.Camera} instance.
*
return mInfo;
}
- public synchronized CameraProxy open(int cameraId)
- throws CameraHardwareException {
+ public synchronized CameraProxy open(
+ Handler handler, int cameraId,
+ CameraManager.CameraOpenCallback cb) {
if (DEBUG_OPEN_RELEASE) {
collectState(cameraId, mCameraDevice);
if (mCameraOpened) {
}
Assert(!mCameraOpened);
if (mCameraDevice != null && mCameraId != cameraId) {
- mCameraDevice.release();
+ mCameraDevice.release(true);
mCameraDevice = null;
mCameraId = -1;
}
if (mCameraDevice == null) {
- try {
- Log.v(TAG, "open camera " + cameraId);
- if (mMockCameraInfo == null) {
- mCameraDevice = CameraManagerFactory
- .getAndroidCameraManager().cameraOpen(cameraId);
- } else {
- if (mMockCamera == null)
- throw new RuntimeException();
+ Log.v(TAG, "open camera " + cameraId);
+ if (mMockCameraInfo == null) {
+ mCameraDevice = CameraManagerFactory
+ .getAndroidCameraManager().cameraOpenOld(handler, cameraId, cb);
+ } else {
+ if (mMockCamera != null) {
mCameraDevice = mMockCamera[cameraId];
+ } else {
+ Log.e(TAG, "MockCameraInfo found, but no MockCamera provided.");
+ mCameraDevice = null;
}
- mCameraId = cameraId;
- } catch (RuntimeException e) {
- Log.e(TAG, "fail to connect Camera", e);
- throw new CameraHardwareException(e);
}
+ if (mCameraDevice == null) {
+ Log.e(TAG, "fail to connect Camera:" + mCameraId + ", aborting.");
+ return null;
+ }
+ mCameraId = cameraId;
mParameters = mCameraDevice.getParameters();
} else {
- try {
- mCameraDevice.reconnect();
- } catch (IOException e) {
- Log.e(TAG, "reconnect failed.");
- throw new CameraHardwareException(e);
+ if (!mCameraDevice.reconnectOld(handler, cb)) {
+ Log.e(TAG, "fail to reconnect Camera:" + mCameraId + ", aborting.");
+ return null;
}
mCameraDevice.setParameters(mParameters);
}
* Tries to open the hardware camera. If the camera is being used or
* unavailable then return {@code null}.
*/
- public synchronized CameraProxy tryOpen(int cameraId) {
- try {
- return !mCameraOpened ? open(cameraId) : null;
- } catch (CameraHardwareException e) {
- // In eng build, we throw the exception so that test tool
- // can detect it and report it
- if ("eng".equals(Build.TYPE)) {
- throw new RuntimeException(e);
- }
- return null;
- }
+ public synchronized CameraProxy tryOpen(
+ Handler handler, int cameraId, CameraManager.CameraOpenCallback cb) {
+ return (!mCameraOpened ? open(handler, cameraId, cb) : null);
}
public synchronized void release() {
if (mCameraDevice == null) return;
- long now = System.currentTimeMillis();
- if (now < mKeepBeforeTime) {
- if (mCameraOpened) {
- mCameraOpened = false;
- mCameraDevice.stopPreview();
- }
- mHandler.sendEmptyMessageDelayed(RELEASE_CAMERA,
- mKeepBeforeTime - now);
- return;
- }
+ strongRelease();
+ }
+
+ public synchronized void strongRelease() {
+ if (mCameraDevice == null) return;
+
mCameraOpened = false;
- mCameraDevice.release();
+ mCameraDevice.release(true);
mCameraDevice = null;
// We must set this to null because it has a reference to Camera.
// Camera has references to the listeners.