mirror of
https://github.com/zxing/zxing.git
synced 2025-03-05 20:48:51 -08:00
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:
parent
238e8d6350
commit
7f05aa2efb
|
@ -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) {
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
Loading…
Reference in a new issue