两种解决方式:1、找到和屏幕分辨率最匹配的PictureSize和PreviewSize(本文使用这种方式) 2、先取比屏幕分辨率大的PreviewSize和PictureSize最后生成图片的时候按屏幕分辨率裁剪(这种方式没试过,但是应该是适配率最高的)
/*** 从列表中选取合适的分辨率(选择最高清效果最好的比例)* 默认w:h = 16:9* <p>注意:这里的w对应屏幕的height* h对应屏幕的width<p/>*/private Camera.Size getProperBestSize(List<Camera.Size> pictureSizeList, float screenRatio) {List<Camera.Size> list = new ArrayList<>();for (int i = pictureSizeList.size() - 1; i >= 0; i--) {Camera.Size size = pictureSizeList.get(i);if(mScreenWidth == size.width && mScreenHeight == size.height){list.add(size);break;}float currentRatio = ((float) size.width) / size.height;if (currentRatio - screenRatio == 0) {list.add(size);}}if (list.size() == 0) {for (int i = pictureSizeList.size() - 1; i >= 0; i--) {Camera.Size size = pictureSizeList.get(i);if (equalRate(size,1.7777f)) {list.add(size);}}}return list.size()==0 ? pictureSizeList.get(0) : list.get(list.size() / 3);}/*** 从列表中选取合适的分辨率* 默认w:h = 4:3* <p>注意:这里的w对应屏幕的height* h对应屏幕的width<p/>*/private Camera.Size getProperSize(List<Camera.Size> pictureSizeList,Camera.Size picSize, float screenRatio) {Log.i(TAG, "screenRatio=" + screenRatio);Camera.Size result = pictureSizeList.get(0);List<Camera.Size> list = new ArrayList<>();for (Camera.Size size : pictureSizeList) {if(picSize.width == size.width && picSize.height == size.height){result = size;break;}float currentRatio = ((float) size.width) / size.height;if (currentRatio - screenRatio == 0) {list.add(size);}}if (list.size() == 0) {for (int i = pictureSizeList.size() - 1; i >= 0; i--) {Camera.Size size = pictureSizeList.get(i);if (equalRate(size,1.7777f)) {list.add(size);}}result = list.get(list.size() / 3);}return result;}private boolean equalRate(Camera.Size s, float rate){float r = (float)(s.width)/(float)(s.height);if(Math.abs(r - rate) <= 0.2){return true;}else{return false;}}