From ed70838051950f58934189f9ad0314208dd48894 Mon Sep 17 00:00:00 2001 From: srowen Date: Fri, 16 Apr 2010 10:56:15 +0000 Subject: [PATCH] Apparent fix for issue 383 / Moment + Android 2.1 issue git-svn-id: http://zxing.googlecode.com/svn/trunk@1309 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../camera/CameraConfigurationManager.java | 26 +++++++------ .../client/android/camera/CameraManager.java | 37 ++++++++++++++----- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java b/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java index e70b1a31..e04c352d 100644 --- a/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java +++ b/android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java @@ -52,8 +52,12 @@ final class CameraConfigurationManager { previewFormat = parameters.getPreviewFormat(); previewFormatString = parameters.get("preview-format"); Log.v(TAG, "Default preview format: " + previewFormat + '/' + previewFormatString); - screenResolution = getScreenResolution(); - cameraResolution = getCameraResolution(parameters); + WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + screenResolution = new Point(display.getWidth(), display.getHeight()); + Log.v(TAG, "Screen resolution: " + screenResolution); + cameraResolution = getCameraResolution(parameters, screenResolution); + Log.v(TAG, "Camera resolution: " + screenResolution); } /** @@ -64,7 +68,7 @@ final class CameraConfigurationManager { */ void setDesiredCameraParameters(Camera camera) { Camera.Parameters parameters = camera.getParameters(); - Log.v(TAG, "Setting preview size: " + cameraResolution.x + ", " + cameraResolution.y); + Log.v(TAG, "Setting preview size: " + cameraResolution); parameters.setPreviewSize(cameraResolution.x, cameraResolution.y); setFlash(parameters); setZoom(parameters); @@ -76,6 +80,10 @@ final class CameraConfigurationManager { return cameraResolution; } + Point getScreenResolution() { + return screenResolution; + } + int getPreviewFormat() { return previewFormat; } @@ -84,13 +92,7 @@ final class CameraConfigurationManager { return previewFormatString; } - private Point getScreenResolution() { - WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); - Display display = manager.getDefaultDisplay(); - return new Point(display.getWidth(), display.getHeight()); - } - - private Point getCameraResolution(Camera.Parameters parameters) { + private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) { String previewSizeValueString = parameters.get("preview-size-values"); // saw this on Xperia @@ -101,7 +103,7 @@ final class CameraConfigurationManager { Point cameraResolution = null; if (previewSizeValueString != null) { - Log.v(TAG, "preview-size parameter: " + previewSizeValueString); + Log.v(TAG, "preview-size-values parameter: " + previewSizeValueString); cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution); } @@ -157,7 +159,7 @@ final class CameraConfigurationManager { return null; } - private static int findBestMotZoomValue(String stringValues, int tenDesiredZoom) { + private static int findBestMotZoomValue(CharSequence stringValues, int tenDesiredZoom) { int tenBestValue = 0; for (String stringValue : COMMA_PATTERN.split(stringValues)) { stringValue = stringValue.trim(); diff --git a/android/src/com/google/zxing/client/android/camera/CameraManager.java b/android/src/com/google/zxing/client/android/camera/CameraManager.java index 5f674718..fc566939 100755 --- a/android/src/com/google/zxing/client/android/camera/CameraManager.java +++ b/android/src/com/google/zxing/client/android/camera/CameraManager.java @@ -16,8 +16,6 @@ package com.google.zxing.client.android.camera; -import com.google.zxing.ResultPoint; - import android.content.Context; import android.content.SharedPreferences; import android.graphics.PixelFormat; @@ -56,6 +54,7 @@ public final class CameraManager { private final CameraConfigurationManager configManager; private Camera camera; private Rect framingRect; + private Rect framingRectInPreview; private boolean initialized; private boolean previewing; private final boolean useOneShotPreviewCallback; @@ -205,31 +204,49 @@ public final class CameraManager { * @return The rectangle to draw on screen in window coordinates. */ public Rect getFramingRect() { - Point cameraResolution = configManager.getCameraResolution(); + Point screenResolution = configManager.getScreenResolution(); if (framingRect == null) { if (camera == null) { return null; } - int width = cameraResolution.x * 3 / 4; + int width = screenResolution.x * 3 / 4; if (width < MIN_FRAME_WIDTH) { width = MIN_FRAME_WIDTH; } else if (width > MAX_FRAME_WIDTH) { width = MAX_FRAME_WIDTH; } - int height = cameraResolution.y * 3 / 4; + int height = screenResolution.y * 3 / 4; if (height < MIN_FRAME_HEIGHT) { height = MIN_FRAME_HEIGHT; } else if (height > MAX_FRAME_HEIGHT) { height = MAX_FRAME_HEIGHT; } - int leftOffset = (cameraResolution.x - width) / 2; - int topOffset = (cameraResolution.y - height) / 2; + int leftOffset = (screenResolution.x - width) / 2; + int topOffset = (screenResolution.y - height) / 2; framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height); Log.v(TAG, "Calculated framing rect: " + framingRect); } return framingRect; } + /** + * Like {@link #getFramingRect} but coordinates are in terms of the preview frame, + * not UI / screen. + */ + public Rect getFramingRectInPreview() { + if (framingRectInPreview == null) { + Rect rect = new Rect(getFramingRect()); + Point cameraResolution = configManager.getCameraResolution(); + Point screenResolution = configManager.getScreenResolution(); + rect.left = rect.left * cameraResolution.x / screenResolution.x; + rect.right = rect.right * cameraResolution.x / screenResolution.x; + rect.top = rect.top * cameraResolution.y / screenResolution.y; + rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y; + framingRectInPreview = rect; + } + return framingRectInPreview; + } + /** * Converts the result points from still resolution coordinates to screen coordinates. * @@ -237,8 +254,9 @@ public final class CameraManager { * @return An array of Points scaled to the size of the framing rect and offset appropriately * so they can be drawn in screen coordinates. */ + /* public Point[] convertResultPoints(ResultPoint[] points) { - Rect frame = getFramingRect(); + Rect frame = getFramingRectInPreview(); int count = points.length; Point[] output = new Point[count]; for (int x = 0; x < count; x++) { @@ -248,6 +266,7 @@ public final class CameraManager { } return output; } + */ /** * A factory method to build the appropriate LuminanceSource object based on the format @@ -259,7 +278,7 @@ public final class CameraManager { * @return A PlanarYUVLuminanceSource instance. */ public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) { - Rect rect = getFramingRect(); + Rect rect = getFramingRectInPreview(); int previewFormat = configManager.getPreviewFormat(); String previewFormatString = configManager.getPreviewFormatString(); switch (previewFormat) { -- 2.20.1