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 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) {
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in a new issue