Skip to content
Snippets Groups Projects
Commit 3fa84ec7 authored by Torsten Grote's avatar Torsten Grote
Browse files

Merge branch '680-release-camera-surface' into 'master'

Release camera surface to work around Android bug #54285

Closes #680

See merge request !340
parents e5f55111 16ecb2ce
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ import android.hardware.Camera.Parameters; ...@@ -8,6 +8,7 @@ import android.hardware.Camera.Parameters;
import android.hardware.Camera.Size; import android.hardware.Camera.Size;
import android.os.Build; import android.os.Build;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Surface;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; import android.view.SurfaceView;
...@@ -40,8 +41,9 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback, ...@@ -40,8 +41,9 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
private Camera camera = null; private Camera camera = null;
private PreviewConsumer previewConsumer = null; private PreviewConsumer previewConsumer = null;
private Surface surface = null;
private int displayOrientation = 0, surfaceWidth = 0, surfaceHeight = 0; private int displayOrientation = 0, surfaceWidth = 0, surfaceHeight = 0;
private boolean autoFocus = false, surfaceExists = false; private boolean autoFocus = false;
public CameraView(Context context) { public CameraView(Context context) {
super(context); super(context);
...@@ -59,8 +61,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback, ...@@ -59,8 +61,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
protected void onAttachedToWindow() { protected void onAttachedToWindow() {
super.onAttachedToWindow(); super.onAttachedToWindow();
setKeepScreenOn(true); setKeepScreenOn(true);
SurfaceHolder holder = getHolder(); getHolder().addCallback(this);
holder.addCallback(this);
} }
@Override @Override
...@@ -68,6 +69,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback, ...@@ -68,6 +69,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
super.onDetachedFromWindow(); super.onDetachedFromWindow();
setKeepScreenOn(false); setKeepScreenOn(false);
getHolder().removeCallback(this); getHolder().removeCallback(this);
if (surface != null) surface.release();
} }
public void start(Camera camera, PreviewConsumer previewConsumer, public void start(Camera camera, PreviewConsumer previewConsumer,
...@@ -92,7 +94,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback, ...@@ -92,7 +94,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
enableAutoFocus(params.getFocusMode()); enableAutoFocus(params.getFocusMode());
// Log the parameters that are being used (maybe not what we asked for) // Log the parameters that are being used (maybe not what we asked for)
logCameraParameters(); logCameraParameters();
if (surfaceExists) startPreview(getHolder()); if (surface != null) startPreview(getHolder());
} }
public void stop() { public void stop() {
...@@ -270,13 +272,18 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback, ...@@ -270,13 +272,18 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
@Override @Override
public void surfaceCreated(SurfaceHolder holder) { public void surfaceCreated(SurfaceHolder holder) {
LOG.info("Surface created"); LOG.info("Surface created");
surfaceExists = true; if (surface != null) throw new IllegalStateException();
surface = holder.getSurface();
if (camera != null) startPreview(holder); if (camera != null) startPreview(holder);
} }
@Override @Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (LOG.isLoggable(INFO)) LOG.info("Surface changed: " + w + "x" + h); if (LOG.isLoggable(INFO)) LOG.info("Surface changed: " + w + "x" + h);
// Release the previous surface if necessary
if (surface != null && surface != holder.getSurface())
surface.release();
surface = holder.getSurface();
surfaceWidth = w; surfaceWidth = w;
surfaceHeight = h; surfaceHeight = h;
if (camera == null) return; // We are stopped if (camera == null) return; // We are stopped
...@@ -295,7 +302,8 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback, ...@@ -295,7 +302,8 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
@Override @Override
public void surfaceDestroyed(SurfaceHolder holder) { public void surfaceDestroyed(SurfaceHolder holder) {
LOG.info("Surface destroyed"); LOG.info("Surface destroyed");
surfaceExists = false; if (holder.getSurface() != surface) throw new IllegalStateException();
if (surface != null) surface.release();
} }
@Override @Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment