From f3da1b84b3b2a8b1b3d0ad46e1f34b7e7b19bc48 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Fri, 3 Apr 2015 17:51:13 +0100 Subject: [PATCH] Use SCENE_MODE_BARCODE if available; don't call autoFocus() repeatedly. --- src/org/briarproject/qrtest/CameraView.java | 71 +++++++++---------- .../briarproject/qrtest/QrTestActivity.java | 14 ++-- 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/org/briarproject/qrtest/CameraView.java b/src/org/briarproject/qrtest/CameraView.java index 3bd7ace..0fb0a93 100644 --- a/src/org/briarproject/qrtest/CameraView.java +++ b/src/org/briarproject/qrtest/CameraView.java @@ -4,6 +4,7 @@ import static android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT; import static android.hardware.Camera.Parameters.FOCUS_MODE_AUTO; import static android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE; import static android.hardware.Camera.Parameters.FOCUS_MODE_MACRO; +import static android.hardware.Camera.Parameters.SCENE_MODE_BARCODE; import static android.view.SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS; import java.io.IOException; @@ -15,7 +16,6 @@ import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; -import android.os.Handler; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -26,44 +26,38 @@ AutoFocusCallback { private static String TAG = CameraView.class.getPackage().getName(); - private final Handler handler; - private Camera camera = null; private PreviewConsumer previewConsumer = null; private Size desiredSize = null; private int displayOrientation = 0; - private boolean stopped = false, autoFocus = false, surfaceExists = false; + private boolean autoFocus = false, surfaceExists = false; public CameraView(Context context) { super(context); - handler = new Handler(); setKeepScreenOn(true); } void start(Camera camera, PreviewConsumer previewConsumer, - int rotationDegrees, boolean macro) { - stopped = false; + int rotationDegrees) { this.camera = camera; this.previewConsumer = previewConsumer; setDisplayOrientation(rotationDegrees); - setFocusMode(macro); + setFocusMode(); SurfaceHolder holder = getHolder(); - holder.addCallback(this); holder.setType(SURFACE_TYPE_PUSH_BUFFERS); // Required on Android < 3.0 if(surfaceExists) startPreview(holder); + else holder.addCallback(this); } void stop() { - stopped = true; stopPreview(); - getHolder().removeCallback(this); } private void startPreview(SurfaceHolder holder) { try { camera.setPreviewDisplay(holder); camera.startPreview(); - autoFocus(); + if(autoFocus) camera.autoFocus(this); previewConsumer.start(camera); } catch(IOException e) { Log.e(TAG, "Error starting camera preview", e); @@ -80,10 +74,6 @@ AutoFocusCallback { } } - private void autoFocus() { - if(!stopped && autoFocus) camera.autoFocus(this); - } - private void setDisplayOrientation(int rotationDegrees) { int orientation; CameraInfo info = new CameraInfo(); @@ -99,26 +89,36 @@ AutoFocusCallback { displayOrientation = orientation; } - private void setFocusMode(boolean macro) { + private void setFocusMode() { Parameters params = camera.getParameters(); - List<String> modes = params.getSupportedFocusModes(); - if(macro && modes.contains(FOCUS_MODE_MACRO)) { - Log.d(TAG, "Setting focus mode to macro"); - params.setFocusMode(FOCUS_MODE_MACRO); - autoFocus = true; - } else if(modes.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) { - Log.d(TAG, "Setting focus mode to continuous"); - params.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE); - autoFocus = false; - } else if(modes.contains(FOCUS_MODE_AUTO)) { - Log.d(TAG, "Setting focus mode to auto"); - params.setFocusMode(FOCUS_MODE_AUTO); - autoFocus = true; + // This returns null on the HTC Wildfire S + List<String> modes = params.getSupportedSceneModes(); + if(modes != null && modes.contains(SCENE_MODE_BARCODE)) { + Log.d(TAG, "Setting scene mode to barcode"); + params.setSceneMode(SCENE_MODE_BARCODE); } else { - Log.d(TAG, "No suitable focus mode"); - autoFocus = false; + modes = params.getSupportedFocusModes(); + if(modes.contains(FOCUS_MODE_MACRO)) { + Log.d(TAG, "Setting focus mode to macro"); + params.setFocusMode(FOCUS_MODE_MACRO); + autoFocus = true; + } else if(modes.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) { + Log.d(TAG, "Setting focus mode to continuous"); + params.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE); + } else if(modes.contains(FOCUS_MODE_AUTO)) { + Log.d(TAG, "Setting focus mode to auto"); + params.setFocusMode(FOCUS_MODE_AUTO); + autoFocus = true; + } else { + Log.d(TAG, "No suitable focus mode"); + } + } + params.setZoom(0); + try { + camera.setParameters(params); + } catch(Exception e) { + Log.e(TAG, "Error setting camera parameters", e); } - camera.setParameters(params); } public void surfaceCreated(SurfaceHolder holder) { @@ -165,11 +165,6 @@ AutoFocusCallback { public void onAutoFocus(boolean success, final Camera camera) { Log.d(TAG, "Auto focus: " + success); - handler.postDelayed(new Runnable() { - public void run() { - autoFocus(); - } - }, success ? 3000 : 0); } @Override diff --git a/src/org/briarproject/qrtest/QrTestActivity.java b/src/org/briarproject/qrtest/QrTestActivity.java index d1b957e..3373f78 100644 --- a/src/org/briarproject/qrtest/QrTestActivity.java +++ b/src/org/briarproject/qrtest/QrTestActivity.java @@ -7,7 +7,6 @@ import static android.view.Gravity.CENTER; import static android.view.View.GONE; import static android.view.View.VISIBLE; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static android.widget.ImageView.ScaleType.FIT_CENTER; import static android.widget.LinearLayout.HORIZONTAL; import static android.widget.LinearLayout.VERTICAL; @@ -28,6 +27,7 @@ implements QrCodeDecoder.ResultCallback { private static String TAG = QrTestActivity.class.getPackage().getName(); + private QrCodeDecoder decoder = null; private CameraView cameraView = null; private LinearLayout cameraBorder = null; private ImageView tickView = null; @@ -38,6 +38,8 @@ implements QrCodeDecoder.ResultCallback { protected void onCreate(Bundle state) { super.onCreate(state); + decoder = new QrCodeDecoder(this); + setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR); cameraView = new CameraView(this); @@ -52,16 +54,16 @@ implements QrCodeDecoder.ResultCallback { tickView.setImageResource(R.drawable.tick); tickView.setScaleType(FIT_CENTER); tickView.setBackgroundColor(WHITE); - tickView.setLayoutParams(new LayoutParams(WRAP_CONTENT, - WRAP_CONTENT, 1)); + tickView.setLayoutParams(new LayoutParams(MATCH_PARENT, + MATCH_PARENT, 1)); tickView.setVisibility(GONE); ImageView qrCodeView = new ImageView(this); qrCodeView.setImageResource(R.drawable.test_code_62_chars); qrCodeView.setScaleType(FIT_CENTER); qrCodeView.setBackgroundColor(WHITE); - qrCodeView.setLayoutParams(new LayoutParams(WRAP_CONTENT, - WRAP_CONTENT, 1)); + qrCodeView.setLayoutParams(new LayoutParams(MATCH_PARENT, + MATCH_PARENT, 1)); Display display = getWindowManager().getDefaultDisplay(); boolean portrait = display.getWidth() < display.getHeight(); @@ -91,7 +93,7 @@ implements QrCodeDecoder.ResultCallback { Log.d(TAG, "Opening camera"); try { camera = Camera.open(); - cameraView.start(camera, new QrCodeDecoder(this), 0, true); + cameraView.start(camera, decoder, 0); } catch(Exception e) { Log.e(TAG, "Error opening camera", e); finish(); -- GitLab