From abb2ca51ab89fc2f0e2c816f231fa9aea4b64c11 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 17 Jun 2016 14:51:32 +0200 Subject: [PATCH] add a couple extra checks to prevent crashing --- .../camera/MainActivity.java | 56 ++++++++++++------- .../com/simplemobiletools/camera/Preview.java | 21 ++++--- app/src/main/res/values/strings.xml | 2 + 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/simplemobiletools/camera/MainActivity.java b/app/src/main/java/com/simplemobiletools/camera/MainActivity.java index 730da158..4f3855d4 100644 --- a/app/src/main/java/com/simplemobiletools/camera/MainActivity.java +++ b/app/src/main/java/com/simplemobiletools/camera/MainActivity.java @@ -135,19 +135,24 @@ public class MainActivity extends AppCompatActivity implements SensorEventListen return; } - disableFlash(); - hideTimer(); if (currCamera == Camera.CameraInfo.CAMERA_FACING_BACK) { currCamera = Camera.CameraInfo.CAMERA_FACING_FRONT; - toggleCameraBtn.setImageResource(R.mipmap.camera_rear); } else { currCamera = Camera.CameraInfo.CAMERA_FACING_BACK; - toggleCameraBtn.setImageResource(R.mipmap.camera_front); } - disableFlash(); + int newIconId = R.mipmap.camera_front; preview.releaseCamera(); - preview.setCamera(currCamera); + if (preview.setCamera(currCamera)) { + if (currCamera == Camera.CameraInfo.CAMERA_FACING_BACK) { + newIconId = R.mipmap.camera_rear; + } + toggleCameraBtn.setImageResource(newIconId); + disableFlash(); + hideTimer(); + } else { + Utils.showToast(getApplicationContext(), R.string.camera_switch_error); + } } @OnClick(R.id.toggle_flash) @@ -239,11 +244,14 @@ public class MainActivity extends AppCompatActivity implements SensorEventListen } private void initVideoButtons() { - final Resources res = getResources(); - togglePhotoVideoBtn.setImageDrawable(res.getDrawable(R.mipmap.photo)); - shutterBtn.setImageDrawable(res.getDrawable(R.mipmap.video_rec)); - preview.initRecorder(); - toggleCameraBtn.setVisibility(View.VISIBLE); + if (preview.initRecorder()) { + final Resources res = getResources(); + togglePhotoVideoBtn.setImageDrawable(res.getDrawable(R.mipmap.photo)); + shutterBtn.setImageDrawable(res.getDrawable(R.mipmap.video_rec)); + toggleCameraBtn.setVisibility(View.VISIBLE); + } else { + Utils.showToast(getApplicationContext(), R.string.video_mode_error); + } } private void hideNavigationBarIcons() { @@ -286,16 +294,19 @@ public class MainActivity extends AppCompatActivity implements SensorEventListen toggleCameraBtn.setVisibility(View.INVISIBLE); } - preview.setCamera(currCamera); - hideNavigationBarIcons(); + if (preview.setCamera(currCamera)) { + hideNavigationBarIcons(); - if (sensorManager != null) { - final Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); - sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); - } + if (sensorManager != null) { + final Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); + sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); + } - if (!isInPhotoMode) { - initVideoButtons(); + if (!isInPhotoMode) { + initVideoButtons(); + } + } else { + Utils.showToast(getApplicationContext(), R.string.camera_switch_error); } } @@ -371,4 +382,11 @@ public class MainActivity extends AppCompatActivity implements SensorEventListen finish(); } } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (preview != null) + preview.releaseCamera(); + } } diff --git a/app/src/main/java/com/simplemobiletools/camera/Preview.java b/app/src/main/java/com/simplemobiletools/camera/Preview.java index 1b568d0c..07c821f2 100644 --- a/app/src/main/java/com/simplemobiletools/camera/Preview.java +++ b/app/src/main/java/com/simplemobiletools/camera/Preview.java @@ -72,7 +72,7 @@ public class Preview extends ViewGroup implements SurfaceHolder.Callback, View.O curVideoPath = ""; } - public void setCamera(int cameraId) { + public boolean setCamera(int cameraId) { currCameraId = cameraId; Camera newCamera; try { @@ -82,11 +82,11 @@ public class Preview extends ViewGroup implements SurfaceHolder.Callback, View.O Utils.showToast(getContext(), R.string.camera_open_error); Log.e(TAG, "setCamera open " + e.getMessage()); callback.setIsCameraAvailable(false); - return; + return false; } if (camera == newCamera) { - return; + return false; } releaseCamera(); @@ -109,6 +109,7 @@ public class Preview extends ViewGroup implements SurfaceHolder.Callback, View.O camera.setPreviewDisplay(surfaceHolder); } catch (IOException e) { Log.e(TAG, "setCamera setPreviewDisplay " + e.getMessage()); + return false; } setupPreview(); } @@ -119,6 +120,8 @@ public class Preview extends ViewGroup implements SurfaceHolder.Callback, View.O if (isVideoMode) { initRecorder(); } + + return true; } public void setTargetUri(Uri uri) { @@ -455,12 +458,14 @@ public class Preview extends ViewGroup implements SurfaceHolder.Callback, View.O } // VIDEO RECORDING - public void initRecorder() { + public boolean initRecorder() { if (camera == null || recorder != null || !isSurfaceCreated) - return; + return false; - camera.lock(); final Camera.Size preferred = parameters.getPreferredPreviewSizeForVideo(); + if (preferred == null) + return false; + parameters.setPreviewSize(preferred.width, preferred.height); camera.setParameters(parameters); @@ -474,7 +479,7 @@ public class Preview extends ViewGroup implements SurfaceHolder.Callback, View.O curVideoPath = Utils.getOutputMediaFile(getContext(), false); if (curVideoPath.isEmpty()) { Utils.showToast(getContext(), R.string.video_creating_error); - return; + return false; } final Camera.Size videoSize = getOptimalVideoSize(); @@ -495,7 +500,9 @@ public class Preview extends ViewGroup implements SurfaceHolder.Callback, View.O Utils.showToast(getContext(), R.string.video_setup_error); Log.e(TAG, "initRecorder " + e.getMessage()); releaseCamera(); + return false; } + return true; } public boolean toggleRecording() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c16b139a..c13f2b3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,8 +5,10 @@ An error occurred at creating the video file An error occurred at saving the video file An error occurred at setting up the recorder + Switching to video mode failed Simple Videos Simple Photos + Switching camera failed Not much to do without accessing your camera and storage We need the audio permission for recording videos