diff --git a/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java b/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java index 451d08c11..0ffa242b6 100644 --- a/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java +++ b/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java @@ -52,11 +52,9 @@ final class CameraConfigurationManager { private final Context context; private Point screenResolution; private Point cameraResolution; - private final ExposureInterface exposure; CameraConfigurationManager(Context context) { this.context = context; - exposure = new ExposureManager().build(); } /** @@ -82,7 +80,7 @@ final class CameraConfigurationManager { Log.i(TAG, "Camera resolution: " + cameraResolution); } - void setDesiredCameraParameters(Camera camera) { + void setDesiredCameraParameters(Camera camera, boolean safeMode) { Camera.Parameters parameters = camera.getParameters(); if (parameters == null) { @@ -90,12 +88,19 @@ final class CameraConfigurationManager { return; } + Log.i(TAG, "Initial camera parameters: " + parameters.flatten()); + + if (safeMode) { + Log.w(TAG, "In camera config safe mode -- most settings will not be honored"); + } + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - initializeTorch(parameters, prefs); + initializeTorch(parameters, prefs, safeMode); + String focusMode = null; if (prefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true)) { - if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_CONTINUOUS_FOCUS, false)) { + if (safeMode || prefs.getBoolean(PreferencesActivity.KEY_DISABLE_CONTINUOUS_FOCUS, false)) { focusMode = findSettableValue(parameters.getSupportedFocusModes(), Camera.Parameters.FOCUS_MODE_AUTO); } else { @@ -106,7 +111,7 @@ final class CameraConfigurationManager { } } // Maybe selected auto-focus but not available, so fall through here: - if (focusMode == null) { + if (!safeMode && focusMode == null) { focusMode = findSettableValue(parameters.getSupportedFocusModes(), Camera.Parameters.FOCUS_MODE_MACRO, "edof"); // Camera.Parameters.FOCUS_MODE_EDOF in 2.2+ @@ -129,7 +134,7 @@ final class CameraConfigurationManager { void setTorch(Camera camera, boolean newSetting) { Camera.Parameters parameters = camera.getParameters(); - doSetTorch(parameters, newSetting); + doSetTorch(parameters, newSetting, false); camera.setParameters(parameters); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean currentSetting = prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false); @@ -140,12 +145,12 @@ final class CameraConfigurationManager { } } - private void initializeTorch(Camera.Parameters parameters, SharedPreferences prefs) { + private void initializeTorch(Camera.Parameters parameters, SharedPreferences prefs, boolean safeMode) { boolean currentSetting = prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false); - doSetTorch(parameters, currentSetting); + doSetTorch(parameters, currentSetting, safeMode); } - private void doSetTorch(Camera.Parameters parameters, boolean newSetting) { + private void doSetTorch(Camera.Parameters parameters, boolean newSetting, boolean safeMode) { String flashMode; if (newSetting) { flashMode = findSettableValue(parameters.getSupportedFlashModes(), @@ -159,7 +164,10 @@ final class CameraConfigurationManager { parameters.setFlashMode(flashMode); } - exposure.setExposure(parameters, newSetting); + if (!safeMode) { + ExposureInterface exposure = new ExposureManager().build(); + exposure.setExposure(parameters, newSetting); + } } private Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution) { diff --git a/android/src/com/google/zxing/client/android/camera/CameraManager.java b/android/src/com/google/zxing/client/android/camera/CameraManager.java index 567a8aed4..4cbc5935c 100755 --- a/android/src/com/google/zxing/client/android/camera/CameraManager.java +++ b/android/src/com/google/zxing/client/android/camera/CameraManager.java @@ -92,7 +92,23 @@ public final class CameraManager { requestedFramingRectHeight = 0; } } - configManager.setDesiredCameraParameters(theCamera); + + Camera.Parameters parameters = theCamera.getParameters(); + String parametersFlattened = parameters == null ? null : parameters.flatten(); // Save these, temporarily + try { + configManager.setDesiredCameraParameters(theCamera, false); + } catch (RuntimeException re) { + // Driver failed + Log.w(TAG, "Camera rejected parameters. Setting only minimal safe-mode parameters"); + Log.i(TAG, "Resetting to saved camera params: " + parametersFlattened); + // Reset: + if (parametersFlattened != null) { + parameters.unflatten(parametersFlattened); + } + theCamera.setParameters(parameters); + configManager.setDesiredCameraParameters(theCamera, true); + } + } public synchronized boolean isOpen() {