异常小记 如有大神提出异议 不胜感激
最近在做一个客户定制的自定义相机,按部就班的写完后,在不同机型上出现了适配问题。
上代码:
if (camera != null) {
Camera.Parameters p = camera.getParameters();
List<String> focusModes = p.getSupportedFocusModes();
if (focusModes
.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
p.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
long time = new Date().getTime();
p.setGpsTimestamp(time);
// 设置照片格式
p.setPictureFormat(PixelFormat.JPEG);
Camera.Size previewSize =findPreviewSizeByScreen(p);
p.setPreviewSize(previewSize.width, previewSize.height);
p.setPictureSize(previewSize.width, previewSize.height);
p.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
try {
camera.setParameters(p);
} catch (Exception e) {
Camera.Size previewSize = findBestPreviewSize(p);
p.setPreviewSize(previewSize.width, previewSize.height);
p.setPictureSize(previewSize.width, previewSize.height);
camera.setParameters(p);
}
}
在原生机器上测试无问题,于是兴冲冲拿去到其他机器上测试,光速打脸。。。。
首先,是在华为的一款机器上,我们自己的原件所设置的宽高,在机器上并不适用于其特定的分辨率,这时我们应该获取机器本身所支持的Size,从中找到适合机器的那一个数值。
int PreviewWidth = 0;
int PreviewHeight = 0;
List<Camera.Size> sizeList = p.getSupportedPreviewSizes();
if (sizeList.size() > 1) {
Iterator<Camera.Size> itor = sizeList.iterator();
while (itor.hasNext()) {
Camera.Size cur = itor.next();
if (cur.width >= PreviewWidth
&& cur.height >= PreviewHeight) {
PreviewWidth = cur.width;
PreviewHeight = cur.height;
break;
}
}
}else if (sizeList.size()==1){
Camera.Size size = sizeList.get(0);
PreviewWidth = size.width;
PreviewHeight = size.height;
}
p.setPreviewSize(PreviewWidth, PreviewHeight); //获得摄像区域的大小
p.setPictureSize(PreviewWidth, PreviewHeight);//设置拍出来的屏幕大小
试验了几个机器没有问题后,遇到了一个vivo,还是报这个错,打了断点后,发现我们这里是可以拿到所支持的宽高的,但是机器本身还是对这个分辨率不适配,所以在try的代码块中拦截到这种情况,不去设置他的PreviewSize和PictureSize,交由机器本身去处理(真是“贴心啊”)。
catch (Exception e) {
Camera.Parameters parameters = camera.getParameters();// 得到摄像头的参数
camera.setParameters(parameters);
}
目前在其他机型上未遇到问题,如果大家有什么想法,希望不吝指教,不胜感激。