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: https://zxing.googlecode.com/svn/trunk@2429 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2012-09-27 20:19:17 +00:00
parent 238e8d6350
commit 7f05aa2efb
2 changed files with 36 additions and 12 deletions

View file

@ -52,11 +52,9 @@ final class CameraConfigurationManager {
private final Context context; private final Context context;
private Point screenResolution; private Point screenResolution;
private Point cameraResolution; private Point cameraResolution;
private final ExposureInterface exposure;
CameraConfigurationManager(Context context) { CameraConfigurationManager(Context context) {
this.context = context; this.context = context;
exposure = new ExposureManager().build();
} }
/** /**
@ -82,7 +80,7 @@ final class CameraConfigurationManager {
Log.i(TAG, "Camera resolution: " + cameraResolution); Log.i(TAG, "Camera resolution: " + cameraResolution);
} }
void setDesiredCameraParameters(Camera camera) { void setDesiredCameraParameters(Camera camera, boolean safeMode) {
Camera.Parameters parameters = camera.getParameters(); Camera.Parameters parameters = camera.getParameters();
if (parameters == null) { if (parameters == null) {
@ -90,12 +88,19 @@ final class CameraConfigurationManager {
return; 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); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
initializeTorch(parameters, prefs); initializeTorch(parameters, prefs, safeMode);
String focusMode = null; String focusMode = null;
if (prefs.getBoolean(PreferencesActivity.KEY_AUTO_FOCUS, true)) { 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(), focusMode = findSettableValue(parameters.getSupportedFocusModes(),
Camera.Parameters.FOCUS_MODE_AUTO); Camera.Parameters.FOCUS_MODE_AUTO);
} else { } else {
@ -106,7 +111,7 @@ final class CameraConfigurationManager {
} }
} }
// Maybe selected auto-focus but not available, so fall through here: // Maybe selected auto-focus but not available, so fall through here:
if (focusMode == null) { if (!safeMode && focusMode == null) {
focusMode = findSettableValue(parameters.getSupportedFocusModes(), focusMode = findSettableValue(parameters.getSupportedFocusModes(),
Camera.Parameters.FOCUS_MODE_MACRO, Camera.Parameters.FOCUS_MODE_MACRO,
"edof"); // Camera.Parameters.FOCUS_MODE_EDOF in 2.2+ "edof"); // Camera.Parameters.FOCUS_MODE_EDOF in 2.2+
@ -129,7 +134,7 @@ final class CameraConfigurationManager {
void setTorch(Camera camera, boolean newSetting) { void setTorch(Camera camera, boolean newSetting) {
Camera.Parameters parameters = camera.getParameters(); Camera.Parameters parameters = camera.getParameters();
doSetTorch(parameters, newSetting); doSetTorch(parameters, newSetting, false);
camera.setParameters(parameters); camera.setParameters(parameters);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean currentSetting = prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false); 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); 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; String flashMode;
if (newSetting) { if (newSetting) {
flashMode = findSettableValue(parameters.getSupportedFlashModes(), flashMode = findSettableValue(parameters.getSupportedFlashModes(),
@ -159,7 +164,10 @@ final class CameraConfigurationManager {
parameters.setFlashMode(flashMode); 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) { private Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution) {

View file

@ -92,7 +92,23 @@ public final class CameraManager {
requestedFramingRectHeight = 0; 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() { public synchronized boolean isOpen() {