在自定义相机的时候,我们一般都会对相机初始化的时候,对预览尺寸以及照片尺寸按照自己的需要进行设置,所以相机闪退大概率是由于我们的计算的尺寸出现了问题,导致相机异常闪退;
首先我们来看下相机预览的分辨率怎么计算:
首先,毋庸置疑的是我们要计算预览分辨率,那么肯定要先拿到到当前设备的宽高,所以
screenWidth = activity.getWindowManager().getDefaultDisplay().getWidth(); screenHeight = activity.getWindowManager().getDefaultDisplay().getHeight();
既然我们拿到了屏幕的宽高,那么接下来就要计算屏幕的宽高比了
double optimal = screenWidth / (double)screenHeight; if (optimal > 1) { optimal = screenHeight / (double)screenWidth; }
我们拿到了宽高比之后,然后获取就该获取当前设备支持的预览分辨率集合了,来找到适合我们的分辨率
double difference = 1;
List<Camera.Size> list=mCamera.getParameters().getSupportedPreviewSizes()
for (Camera.Size size:list) { double ratio = (double) size.height / size.width; double adapterRatio = Math.abs(ratio - optimalScale); if (size.height < 500) continue; if (adapterRatio < 1) { difference = adapterRatio; } }
通过上面的便利查找,找到了系统支持的预览分辨率和屏幕宽高比最相近的,那么接下来就是我们将最相近的分辨率,并且返回到调用的地方即可
for(Camera.Size size:list) { double ratio = (double) size.height / size.width; if (size.height < 500) continue; if (Math.abs(ratio-optimalScale) < (difference+0.001)) { if (optimalSize != null) { if (size.height>700 && size.height<1200) { //如果匹配上最佳分辨率,直接返回 return size; }else { if (optimalSize.width < size.width || optimalSize.height < size.height) { optimalSize = size; } } } else { optimalSize = size; } } }
接下来就该计算照片的分辨率了,其实照片分辨率和预览的分辨率计算方法基本上是一致的,可以参考上面分辨率计算方法。