diff options
| author | Sean Owen <sowen@cloudera.com> | 2017-05-05 02:29:57 +0300 |
|---|---|---|
| committer | Sean Owen <sowen@cloudera.com> | 2017-05-05 02:30:05 +0300 |
| commit | 3d0468e92f0cc8a7fba9c6e1355e3f7bc1f7d93f (patch) | |
| tree | a04184e37ee1f0e4293bbdb02c5b2ad4c3d11c3f /android-core/src/main/java/com/google | |
| parent | ff7137e512b5464e15f5f2ef8870d3c7e0d1baa0 (diff) | |
| download | zxing-3d0468e92f0cc8a7fba9c6e1355e3f7bc1f7d93f.tar.xz | |
Issue #795: avoid sorting preview sizes
Diffstat (limited to 'android-core/src/main/java/com/google')
| -rw-r--r-- | android-core/src/main/java/com/google/zxing/client/android/camera/CameraConfigurationUtils.java | 52 |
1 files 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 1a28ffa6e..c9d3eff1a 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.hardware.Camera; 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 final class CameraConfigurationUtils { return new Point(defaultSize.width, defaultSize.height); } - // Sort by size, descending - List<Camera.Size> supportedPreviewSizes = new ArrayList<>(rawSupportedSizes); - Collections.sort(supportedPreviewSizes, new Comparator<Camera.Size>() { - @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<Camera.Size> 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 final class CameraConfigurationUtils { double aspectRatio = maybeFlippedWidth / (double) maybeFlippedHeight; double distortion = Math.abs(aspectRatio - screenAspectRatio); if (distortion > MAX_ASPECT_DISTORTION) { - it.remove(); continue; } @@ -338,14 +317,19 @@ public final class CameraConfigurationUtils { 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; } |
