From 3d0468e92f0cc8a7fba9c6e1355e3f7bc1f7d93f Mon Sep 17 00:00:00 2001 From: Sean Owen Date: Fri, 5 May 2017 00:29:57 +0100 Subject: [PATCH] Issue #795: avoid sorting preview sizes --- .../camera/CameraConfigurationUtils.java | 52 +++++++------------ 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java b/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java index 1a28ffa6e1..c9d3eff1ae 100644 --- a/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java +++ b/android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java @@ -22,11 +22,9 @@ import android.os.Build; import android.util.Log; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; @@ -284,42 +282,24 @@ public static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point return new Point(defaultSize.width, defaultSize.height); } - // Sort by size, descending - List supportedPreviewSizes = new ArrayList<>(rawSupportedSizes); - Collections.sort(supportedPreviewSizes, new Comparator() { - @Override - public int compare(Camera.Size a, Camera.Size b) { - int aPixels = a.height * a.width; - int bPixels = b.height * b.width; - if (bPixels < aPixels) { - return -1; - } - if (bPixels > aPixels) { - return 1; - } - return 0; - } - }); - if (Log.isLoggable(TAG, Log.INFO)) { StringBuilder previewSizesString = new StringBuilder(); - for (Camera.Size supportedPreviewSize : supportedPreviewSizes) { - previewSizesString.append(supportedPreviewSize.width).append('x') - .append(supportedPreviewSize.height).append(' '); + for (Camera.Size size : rawSupportedSizes) { + previewSizesString.append(size.width).append('x').append(size.height).append(' '); } Log.i(TAG, "Supported preview sizes: " + previewSizesString); } double screenAspectRatio = screenResolution.x / (double) screenResolution.y; - // Remove sizes that are unsuitable - Iterator it = supportedPreviewSizes.iterator(); - while (it.hasNext()) { - Camera.Size supportedPreviewSize = it.next(); - int realWidth = supportedPreviewSize.width; - int realHeight = supportedPreviewSize.height; - if (realWidth * realHeight < MIN_PREVIEW_PIXELS) { - it.remove(); + // Find a suitable size, with max resolution + int maxResolution = 0; + Camera.Size maxResPreviewSize = null; + for (Camera.Size size : rawSupportedSizes) { + int realWidth = size.width; + int realHeight = size.height; + int resolution = realWidth * realHeight; + if (resolution < MIN_PREVIEW_PIXELS) { continue; } @@ -329,7 +309,6 @@ public int compare(Camera.Size a, Camera.Size b) { double aspectRatio = maybeFlippedWidth / (double) maybeFlippedHeight; double distortion = Math.abs(aspectRatio - screenAspectRatio); if (distortion > MAX_ASPECT_DISTORTION) { - it.remove(); continue; } @@ -338,14 +317,19 @@ public int compare(Camera.Size a, Camera.Size b) { Log.i(TAG, "Found preview size exactly matching screen size: " + exactPoint); return exactPoint; } + + // Resolution is suitable; record the one with max resolution + if (resolution > maxResolution) { + maxResolution = resolution; + maxResPreviewSize = size; + } } // If no exact match, use largest preview size. This was not a great idea on older devices because // of the additional computation needed. We're likely to get here on newer Android 4+ devices, where // the CPU is much more powerful. - if (!supportedPreviewSizes.isEmpty()) { - Camera.Size largestPreview = supportedPreviewSizes.get(0); - Point largestSize = new Point(largestPreview.width, largestPreview.height); + if (maxResPreviewSize != null) { + Point largestSize = new Point(maxResPreviewSize.width, maxResPreviewSize.height); Log.i(TAG, "Using largest suitable preview size: " + largestSize); return largestSize; }