private int mFrameWidth;
private int mFrameHeight;
private byte[] mFrame;
- private boolean mThreadRun;
+ private volatile boolean mThreadRun;
private byte[] mBuffer;
private SurfaceTexture mSf;
public boolean openCamera() {
Log.i(TAG, "openCamera");
- mCamera = Camera.open();
+ mCamera = null;
+ try {
+ mCamera = Camera.open();
+ }
+ catch (Exception e){
+ Log.e(TAG, "Camera is not available (in use or does not exist)");
+ e.printStackTrace();
+ }
if(mCamera == null) {
- Log.e(TAG, "Can't open camera!");
+ Log.e(TAG, "Failed to open camera");
return false;
}
synchronized (this) {
if (mCamera != null) {
mCamera.stopPreview();
- mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
Log.i(TAG, "setupCamera");
synchronized (this) {
if (mCamera != null) {
+ Log.i(TAG, "setupCamera - " + width + "x" + height);
Camera.Parameters params = mCamera.getParameters();
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
mFrameWidth = width;
public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) {
Log.i(TAG, "surfaceChanged");
+ // stop preview before making changes
+ try {
+ mCamera.stopPreview();
+ } catch (Exception e){
+ // ignore: tried to stop a non-existent preview
+ }
+
+ // start preview with new settings
setupCamera(width, height);
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG, "surfaceDestroyed");
- releaseCamera();
}
/* The bitmap returned by this method shall be owned by the child and released in onPreviewStopped() */
synchronized (this) {
try {
this.wait();
+ if (!mThreadRun)
+ break;
bmp = processFrame(mFrame);
} catch (InterruptedException e) {
e.printStackTrace();