summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>2012-09-28 00:19:17 +0400
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>2012-09-28 00:19:17 +0400
commit36821e61ca39dafdfd5840bcce8eba8b1cf237fb (patch)
tree3f407040b7a9b168900cd115f7e8ffc5d715546a
parent2dbc808ec00c211c0623d882f6433f351ca7892d (diff)
downloadzxing-android-embedded-36821e61ca39dafdfd5840bcce8eba8b1cf237fb.tar.xz
Enough with the camera bugs, step 1: add a fall-back 'safe mode' that tries to reconfig the camera with minimal parameters, if the device driver barfs explicitly
git-svn-id: http://zxing.googlecode.com/svn/trunk/android@2429 59b500cc-1b3d-0410-9834-0bbf25fbcc57
-rw-r--r--src/com/google/zxing/client/android/camera/CameraConfigurationManager.java30
-rwxr-xr-xsrc/com/google/zxing/client/android/camera/CameraManager.java18
2 files changed, 36 insertions, 12 deletions
diff --git a/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java b/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java
index 451d08c1..0ffa242b 100644
--- a/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java
+++ b/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/src/com/google/zxing/client/android/camera/CameraManager.java b/src/com/google/zxing/client/android/camera/CameraManager.java
index 567a8aed..4cbc5935 100755
--- a/src/com/google/zxing/client/android/camera/CameraManager.java
+++ b/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() {