在自定义相机中,遇到拍照时 ,一直卡在拍照,于是打断点发现拍照后onPictureTaken回调不执行
相机的分辨率分为:(1)预览尺寸(2)拍照照片尺寸
且两个分辨率值存在不同,当设置分辨率时需要获取当前相机是否存在该分辨率,
否则会出现卡顿情况
解决办法:获取相机的最佳预览尺寸,以及最佳拍照尺寸,
// 获取相机参数
parameters = mCamera.getParameters();
//设置分辨率
String[] split_preview= getPreviewList(context,camera).split("x");
parameters.setPreviewSize(Integer.parseInt(split_preview[0]),
Integer.parseInt(split_preview[1]));
String[] split_picture= getPictureList(context,camera).split("x");
parameters.setPictureSize(Integer.parseInt(split_picture[0]),
Integer.parseInt(split_picture[1]));
// 获取相机预览最大分辨率值
public static String getPreviewList(Context context,Camera camera) {
//获取屏幕高
int screenHeight =context.getResources().getDisplayMetrics().heightPixels;
//获取屏幕宽
int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
List<String> previewList = new ArrayList<String>();
List<Size> previewSizes = camera.getParameters().getSupportedPreviewSizes();
// 获取图片大小
if (previewSizes.size() > 0) {
Collections.sort(previewSizes, new CameraSizeComparator());
for (Size size : previewSizes) {
previewList.add(size.width + "x" + size.height);
}
int i = 0;
for (Size s : previewSizes) {
if ((s.height == screenWidth) && s.width >= screenHeight) {
break;
}
i++;
}
if (i == previewSizes.size()) {
i = previewSizes.size() - 1;//如果没找到,就选最大的size
}
return previewList.get(i);
}
return "";
}
// 获取相机拍照最大分辨率值
public static String getPictureList(Context context,Camera camera) {
//获取屏幕高
int screenHeight =context.getResources().getDisplayMetrics().heightPixels;
//获取屏幕宽
int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
List<Size> pictureSizes = camera.getParameters().getSupportedPictureSizes();
// 获取图片大小
if (pictureSizes.size() > 0) {
Collections.sort(pictureSizes, new CameraSizeComparator());
for (Size size : pictureSizes) {
previewList.add(size.width + "x" + size.height);
}
int i = 0;
for (Size s : pictureSizes) {
if ((s.height >= screenWidth) && s.width >= screenHeight) {
break;
}
i++;
}
if (i == pictureSizes.size()) {
if(pictureSizes.size()/2==0){ //取中间值
i=pictureSizes.size()/2;
}else{
i=pictureSizes.size()/2+1;
}
}
return previewList.get(i);
}
return "";
}
// list排序,按升序排列
public static class CameraSizeComparator implements Comparator<Camera.Size> {
@Override
public int compare(Size lhs, Size rhs) {
if (lhs.width == rhs.width) {
return 0;
} else if (lhs.width > rhs.width) {
return 1;
} else {
return -1;
}
}
}