+ private Point getCameraResolution(Camera.Parameters parameters) {
+
+ String previewSizeValueString = parameters.get("preview-size-values");
+ // saw this on Xperia
+ if (previewSizeValueString == null) {
+ previewSizeValueString = parameters.get("preview-size-value");
+ }
+ Point cameraResolution = null;
+ if (previewSizeValueString != null) {
+ Log.v(TAG, "preview-size parameter: " + previewSizeValueString);
+ cameraResolution = findBestPreviewSizeValue(previewSizeValueString);
+ }
+
+ if (cameraResolution == null) {
+ Camera.Size cameraPreviewSize = parameters.getPreviewSize();
+ if (cameraPreviewSize != null) {
+ Log.v(TAG, "Default preview size: " + cameraPreviewSize.width + ", " + cameraPreviewSize.height);
+ cameraResolution = new Point(cameraPreviewSize.width, cameraPreviewSize.height);
+ }
+ }
+
+ if (cameraResolution == null) {
+ cameraResolution = new Point(screenResolution.x, screenResolution.y);
+ }
+
+ // Ensure that the camera resolution is a multiple of 8, as the screen may not be.
+ cameraResolution.x = (cameraResolution.x >> 3) << 3;
+ cameraResolution.y = (cameraResolution.y >> 3) << 3;
+
+ return cameraResolution;
+ }
+
+ private static Point findBestPreviewSizeValue(String previewSizeValueString) {
+ int bestX = 0;
+ int bestY = 0;
+ int diff = Integer.MAX_VALUE;
+ for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {
+
+ previewSize = previewSize.trim();
+ int dimPosition = previewSize.indexOf('x');
+ if (dimPosition < 0) {
+ Log.w(TAG, "Bad preview-size");
+ continue;
+ }
+
+ int newX;
+ int newY;
+ try {
+ newX = Integer.parseInt(previewSize.substring(0, dimPosition));
+ newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
+ } catch (NumberFormatException nfe) {
+ Log.w(TAG, "Bad preview-size");
+ continue;
+ }
+
+ int newDiff = Math.abs(newX - TARGET_PREVIEW_WIDTH) + Math.abs(newY - TARGET_PREVIEW_HEIGHT);
+ if (newDiff == 0) {
+ bestX = newX;
+ bestY = newY;
+ break;
+ } else if (newDiff < diff) {
+ bestX = newX;
+ bestY = newY;
+ diff = newDiff;
+ }
+
+ }
+
+ if (bestX > 0 && bestY > 0) {
+ return new Point(bestX, bestY);
+ }
+ return null;
+ }
+