Merge branch '1009-camera-npe' into 'master'

Prevent NPE in CameraView

Closes #1009 and #997

See merge request !577
This commit is contained in:
akwizgran
2017-08-01 13:29:33 +00:00

View File

@@ -7,6 +7,7 @@ import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters; 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.support.annotation.Nullable;
import android.support.annotation.UiThread; import android.support.annotation.UiThread;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Surface; import android.view.Surface;
@@ -43,6 +44,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
private static final Logger LOG = private static final Logger LOG =
Logger.getLogger(CameraView.class.getName()); Logger.getLogger(CameraView.class.getName());
@Nullable
private Camera camera = null; private Camera camera = null;
private PreviewConsumer previewConsumer = null; private PreviewConsumer previewConsumer = null;
private Surface surface = null; private Surface surface = null;
@@ -86,6 +88,8 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
try { try {
LOG.info("Opening camera"); LOG.info("Opening camera");
camera = Camera.open(); camera = Camera.open();
if (camera == null)
throw new RuntimeException("No back-facing camera.");
} catch (RuntimeException e) { } catch (RuntimeException e) {
LOG.log(WARNING, "Error opening camera", e); LOG.log(WARNING, "Error opening camera", e);
return; return;
@@ -129,6 +133,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
private void startPreview(SurfaceHolder holder) { private void startPreview(SurfaceHolder holder) {
LOG.info("Starting preview"); LOG.info("Starting preview");
try { try {
if (camera == null) throw new IOException("Camera is null.");
camera.setPreviewDisplay(holder); camera.setPreviewDisplay(holder);
camera.startPreview(); camera.startPreview();
previewStarted = true; previewStarted = true;
@@ -142,6 +147,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
private void stopPreview() { private void stopPreview() {
LOG.info("Stopping preview"); LOG.info("Stopping preview");
try { try {
if (camera == null) throw new RuntimeException("Camera is null.");
stopConsumer(); stopConsumer();
camera.stopPreview(); camera.stopPreview();
} catch (RuntimeException e) { } catch (RuntimeException e) {
@@ -152,12 +158,14 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
@UiThread @UiThread
private void startConsumer() { private void startConsumer() {
if (camera == null) throw new RuntimeException("Camera is null");
if (autoFocus) camera.autoFocus(this); if (autoFocus) camera.autoFocus(this);
previewConsumer.start(camera); previewConsumer.start(camera);
} }
@UiThread @UiThread
private void stopConsumer() { private void stopConsumer() {
if (camera == null) throw new RuntimeException("Camera is null");
if (autoFocus) camera.cancelAutoFocus(); if (autoFocus) camera.cancelAutoFocus();
previewConsumer.stop(); previewConsumer.stop();
} }
@@ -176,6 +184,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
if (LOG.isLoggable(INFO)) if (LOG.isLoggable(INFO))
LOG.info("Display orientation " + orientation + " degrees"); LOG.info("Display orientation " + orientation + " degrees");
try { try {
if (camera == null) throw new RuntimeException("Camera is null");
camera.setDisplayOrientation(orientation); camera.setDisplayOrientation(orientation);
} catch (RuntimeException e) { } catch (RuntimeException e) {
LOG.log(WARNING, "Error setting display orientation", e); LOG.log(WARNING, "Error setting display orientation", e);
@@ -216,7 +225,11 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
setFocusMode(params); setFocusMode(params);
params.setFlashMode(FLASH_MODE_OFF); params.setFlashMode(FLASH_MODE_OFF);
setPreviewSize(params); setPreviewSize(params);
camera.setParameters(params); try {
camera.setParameters(params);
} catch (RuntimeException e) {
LOG.log(WARNING, "Error setting best camera parameters", e);
}
return camera.getParameters(); return camera.getParameters();
} }
@@ -287,7 +300,7 @@ public class CameraView extends SurfaceView implements SurfaceHolder.Callback,
@UiThread @UiThread
private void logCameraParameters() { private void logCameraParameters() {
if (LOG.isLoggable(INFO)) { if (camera != null && LOG.isLoggable(INFO)) {
Parameters params = camera.getParameters(); Parameters params = camera.getParameters();
if (Build.VERSION.SDK_INT >= 15) { if (Build.VERSION.SDK_INT >= 15) {
LOG.info("Video stabilisation enabled: " LOG.info("Video stabilisation enabled: "