From ac841d07c1d3564869953d9a3dd0e2fd73a6530e Mon Sep 17 00:00:00 2001 From: mkotyk Date: Tue, 7 Feb 2017 09:47:17 -0500 Subject: [PATCH 1/2] - Expose a callback when no cameras are detected. - Fix crashes related to no camera (tested in emulator) --- .../android/cameraview/demo/MainActivity.java | 7 +++++++ demo/src/main/res/values/strings.xml | 1 + .../com/google/android/cameraview/Camera1.java | 15 +++++++++++++-- .../com/google/android/cameraview/Camera2.java | 12 ++++++++++-- .../google/android/cameraview/CameraViewImpl.java | 2 ++ .../com/google/android/cameraview/CameraView.java | 15 +++++++++++++++ 6 files changed, 48 insertions(+), 4 deletions(-) diff --git a/demo/src/main/java/com/google/android/cameraview/demo/MainActivity.java b/demo/src/main/java/com/google/android/cameraview/demo/MainActivity.java index 99119475..7c0d3210 100644 --- a/demo/src/main/java/com/google/android/cameraview/demo/MainActivity.java +++ b/demo/src/main/java/com/google/android/cameraview/demo/MainActivity.java @@ -247,6 +247,13 @@ public void onCameraClosed(CameraView cameraView) { Log.d(TAG, "onCameraClosed"); } + @Override + public void onCameraNotAvailable(CameraView cameraView) { + Log.d(TAG, "onCameraNotAvailable"); + Toast.makeText(cameraView.getContext(), R.string.camera_not_available, + Toast.LENGTH_LONG).show(); + } + @Override public void onPictureTaken(CameraView cameraView, final byte[] data) { Log.d(TAG, "onPictureTaken " + data.length); diff --git a/demo/src/main/res/values/strings.xml b/demo/src/main/res/values/strings.xml index 76225995..5b62f479 100644 --- a/demo/src/main/res/values/strings.xml +++ b/demo/src/main/res/values/strings.xml @@ -22,4 +22,5 @@ Flash auto Flash off Flash on + There are no cameras available. diff --git a/library/src/main/api14/com/google/android/cameraview/Camera1.java b/library/src/main/api14/com/google/android/cameraview/Camera1.java index 1830c185..ef7a86f5 100644 --- a/library/src/main/api14/com/google/android/cameraview/Camera1.java +++ b/library/src/main/api14/com/google/android/cameraview/Camera1.java @@ -87,7 +87,10 @@ public void onSurfaceChanged() { @Override boolean start() { chooseCamera(); - openCamera(); + if (!openCamera()) { + return false; + } + if (mPreview.isReady()) { setUpPreview(); } @@ -285,10 +288,17 @@ private void chooseCamera() { mCameraId = INVALID_CAMERA_ID; } - private void openCamera() { + private boolean openCamera() { if (mCamera != null) { releaseCamera(); } + + mCamera = null; + if (mCameraId == INVALID_CAMERA_ID) { + mCallback.onCameraNotAvailable(); + return false; + } + mCamera = Camera.open(mCameraId); mCameraParameters = mCamera.getParameters(); // Supported preview sizes @@ -308,6 +318,7 @@ private void openCamera() { adjustCameraParameters(); mCamera.setDisplayOrientation(calcCameraRotation(mDisplayOrientation)); mCallback.onCameraOpened(); + return true; } private AspectRatio chooseAspectRatio() { diff --git a/library/src/main/api21/com/google/android/cameraview/Camera2.java b/library/src/main/api21/com/google/android/cameraview/Camera2.java index 4835f89e..34dd7329 100644 --- a/library/src/main/api21/com/google/android/cameraview/Camera2.java +++ b/library/src/main/api21/com/google/android/cameraview/Camera2.java @@ -357,8 +357,12 @@ private boolean chooseCameraIdByFacing() { int internalFacing = INTERNAL_FACINGS.get(mFacing); final String[] ids = mCameraManager.getCameraIdList(); if (ids.length == 0) { // No camera - throw new RuntimeException("No camera available."); + mCameraId = null; + Log.e(TAG, "No camera devices present."); + mCallback.onCameraNotAvailable(); + return false; } + for (String id : ids) { CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(id); Integer level = characteristics.get( @@ -458,9 +462,13 @@ private void prepareImageReader() { *

The result will be processed in {@link #mCameraDeviceCallback}.

*/ private void startOpeningCamera() { + if (mCameraId == null) { + return; + } + try { mCameraManager.openCamera(mCameraId, mCameraDeviceCallback, null); - } catch (CameraAccessException e) { + } catch (SecurityException|CameraAccessException e) { throw new RuntimeException("Failed to open camera: " + mCameraId, e); } } diff --git a/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java b/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java index 31dab0c4..49575381 100644 --- a/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java +++ b/library/src/main/base/com/google/android/cameraview/CameraViewImpl.java @@ -75,6 +75,8 @@ interface Callback { void onCameraClosed(); + void onCameraNotAvailable(); + void onPictureTaken(byte[] data); } diff --git a/library/src/main/java/com/google/android/cameraview/CameraView.java b/library/src/main/java/com/google/android/cameraview/CameraView.java index 04826d84..7719ce40 100644 --- a/library/src/main/java/com/google/android/cameraview/CameraView.java +++ b/library/src/main/java/com/google/android/cameraview/CameraView.java @@ -442,6 +442,13 @@ public void onCameraClosed() { } } + @Override + public void onCameraNotAvailable() { + for (Callback callback : mCallbacks) { + callback.onCameraNotAvailable(CameraView.this); + } + } + @Override public void onPictureTaken(byte[] data) { for (Callback callback : mCallbacks) { @@ -527,6 +534,14 @@ public void onCameraOpened(CameraView cameraView) { public void onCameraClosed(CameraView cameraView) { } + /** + * Called when there is no camera to open + * + * @param cameraView The associated {@link CameraView}. + */ + public void onCameraNotAvailable(CameraView cameraView) { + } + /** * Called when a picture is taken. * From cedeafa6dd2ec1f595f1ae9677931afb5d87f528 Mon Sep 17 00:00:00 2001 From: mkotyk Date: Thu, 9 Mar 2017 09:05:59 -0500 Subject: [PATCH 2/2] - Catch exception on camera1 open --- .../api14/com/google/android/cameraview/Camera1.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/library/src/main/api14/com/google/android/cameraview/Camera1.java b/library/src/main/api14/com/google/android/cameraview/Camera1.java index ef7a86f5..0eccc1bd 100644 --- a/library/src/main/api14/com/google/android/cameraview/Camera1.java +++ b/library/src/main/api14/com/google/android/cameraview/Camera1.java @@ -299,7 +299,16 @@ private boolean openCamera() { return false; } - mCamera = Camera.open(mCameraId); + try { + mCamera = Camera.open(mCameraId); + } + catch(RuntimeException ex) { + mCamera = null; + mCallback.onCameraNotAvailable(); + return false; + } + + assert(mCamera != null); mCameraParameters = mCamera.getParameters(); // Supported preview sizes mPreviewSizes.clear();