android 自定义相机拍照时卡死

在自定义相机中,遇到拍照时 ,一直卡在拍照,于是打断点发现拍照后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;
			}
		}

	}

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值