|
@@ -8,6 +8,7 @@ import android.util.Log;
|
|
|
import android.view.Display;
|
|
|
import android.view.WindowManager;
|
|
|
|
|
|
+import java.util.List;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
/**
|
|
@@ -41,15 +42,16 @@ final class CameraConfigurationManager {
|
|
|
Display display = manager.getDefaultDisplay();
|
|
|
screenResolution = new Point(display.getWidth(), display.getHeight());
|
|
|
|
|
|
- Point screenResolutionForCamera = new Point();
|
|
|
- screenResolutionForCamera.x = screenResolution.x;
|
|
|
+ // Point screenResolutionForCamera = new Point();
|
|
|
+ /*screenResolutionForCamera.x = screenResolution.x;
|
|
|
screenResolutionForCamera.y = screenResolution.y;
|
|
|
|
|
|
if (screenResolution.x < screenResolution.y) {
|
|
|
screenResolutionForCamera.x = screenResolution.y;
|
|
|
screenResolutionForCamera.y = screenResolution.x;
|
|
|
- }
|
|
|
- cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
|
|
|
+ }*/
|
|
|
+ //cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
|
|
|
+ cameraResolution = getCameraResolution1(parameters, screenResolution);
|
|
|
}
|
|
|
|
|
|
void setDesiredCameraParameters(Camera camera) {
|
|
@@ -101,6 +103,77 @@ final class CameraConfigurationManager {
|
|
|
return cameraResolution;
|
|
|
}
|
|
|
|
|
|
+ private static Point getCameraResolution1(Camera.Parameters parameters, Point screenResolution) {
|
|
|
+
|
|
|
+ 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.d(TAG, "preview-size-values parameter: " + previewSizeValueString);
|
|
|
+// cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution);
|
|
|
+
|
|
|
+ List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();//获取所有支持的camera尺寸
|
|
|
+ cameraResolution = getOptimalPreviewSize(true, sizeList, screenResolution.x, screenResolution.y);//获取一个最为适配的屏幕尺寸
|
|
|
+ }
|
|
|
+
|
|
|
+ if (cameraResolution == null) {
|
|
|
+ // Ensure that the camera resolution is a multiple of 8, as the screen may not be.
|
|
|
+ cameraResolution = new Point(
|
|
|
+ (screenResolution.x >> 3) << 3,
|
|
|
+ (screenResolution.y >> 3) << 3);
|
|
|
+ }
|
|
|
+
|
|
|
+ return cameraResolution;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过对比得到与宽高比最接近的预览尺寸(如果有相同尺寸,优先选择)
|
|
|
+ *
|
|
|
+ * @param isPortrait 是否竖屏
|
|
|
+ * @param surfaceWidth 需要被进行对比的原宽
|
|
|
+ * @param surfaceHeight 需要被进行对比的原高
|
|
|
+ * @param preSizeList 需要对比的预览尺寸列表
|
|
|
+ * @return 得到与原宽高比例最接近的尺寸
|
|
|
+ */
|
|
|
+ public static Point getOptimalPreviewSize(boolean isPortrait, List<Camera.Size> preSizeList, int surfaceWidth, int surfaceHeight) {
|
|
|
+ int reqTmpWidth;
|
|
|
+ int reqTmpHeight;
|
|
|
+ // 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高
|
|
|
+ if (isPortrait) {
|
|
|
+ reqTmpWidth = surfaceHeight;
|
|
|
+ reqTmpHeight = surfaceWidth;
|
|
|
+ } else {
|
|
|
+ reqTmpWidth = surfaceWidth;
|
|
|
+ reqTmpHeight = surfaceHeight;
|
|
|
+ }
|
|
|
+ //先查找preview中是否存在与surfaceview相同宽高的尺寸
|
|
|
+ for(Camera.Size size : preSizeList){
|
|
|
+ if((size.width == reqTmpWidth) && (size.height == reqTmpHeight)){
|
|
|
+ return new Point(size.width, size.height);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 得到与传入的宽高比最接近的size
|
|
|
+ float reqRatio = ((float) reqTmpWidth) / reqTmpHeight;
|
|
|
+ float curRatio, deltaRatio;
|
|
|
+ float deltaRatioMin = Float.MAX_VALUE;
|
|
|
+ Camera.Size retSize = null;
|
|
|
+ for (Camera.Size size : preSizeList) {
|
|
|
+ curRatio = ((float) size.width) / size.height;
|
|
|
+ deltaRatio = Math.abs(reqRatio - curRatio);
|
|
|
+ if (deltaRatio < deltaRatioMin) {
|
|
|
+ deltaRatioMin = deltaRatio;
|
|
|
+ retSize = size;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new Point(retSize.width, retSize.height);
|
|
|
+ }
|
|
|
+
|
|
|
private static Point findBestPreviewSizeValue(
|
|
|
CharSequence previewSizeValueString, Point screenResolution) {
|
|
|
int bestX = 0;
|