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 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) {

View file

@ -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() {