【ANDROID】解决使用ZXING扫码,距离近无法识别的问题。
来源:互联网 发布:无线网络转换有线网络 编辑:程序博客网 时间:2024/05/01 16:54
在使用zxing扫码时,如果做了横竖屏的兼容处理。一般会发现当扫码距离较近时,有些手机上无法识别二维码的问题。
这个主要是由于设定的PreviewSize不对导致的。
主要修改的方法是CameraConfigurationManager.getCameraResolution。
他主要对cameraResolution进行初始化,而这个值有影响了,我们在解码时(DecodeHandler.decode())的解码区域相关。
CameraConfigurationManager.getCameraResolution调用findBestPreviewSizeValue获得PreviewSize。系统本身提供了一套,但是这里我推荐使用以下方式来查找合适的PreviewSize。
1、PreviewSize的height应该大于当前的扫码区域(CameraManager.get().getFramingRect())。
2、PreviewSize的宽高比应该和当前屏幕的宽高比一致,否则会有拉伸的问题。
3、如果按照以上方式未找到合适的,则调用系统之前的方法进行补漏。
进而得到的方法如下:
private static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution) { Point point = null; Rect frame = CameraManager.get().getFramingRect(); int frameSize = frame.right - frame.left; int discountMax = Integer.MAX_VALUE; int width = 0; int height = 0; List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes(); for (Size size : supportedPreviewSizes) { int discount = size.height - frameSize; if (discount > 0 && size.height * screenResolution.x == screenResolution.y * size.width) { if (discount < discountMax) { discountMax = discount; width = size.width; height = size.height; } } } if (width * height != 0) { point = new Point(width, height); } if (point == null) { String previewSizeValueString = parameters.get("preview-size-values"); // saw this on Xperia if (previewSizeValueString == null) { previewSizeValueString = parameters.get("preview-size-value"); } if (previewSizeValueString != null) { Log.d(TAG, "preview-size-values parameter: " + previewSizeValueString); return findBestPreviewSizeValue(previewSizeValueString, screenResolution); } else { return null; } } else { return point; } }
然后在CameraConfigurationManager.getCameraResolution中调用新的方法,如下:
private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) { Point cameraResolution = null; cameraResolution = findBestPreviewSizeValue(parameters, screenResolution); if (cameraResolution == null) { // Ensure that the camera resolution is a multiple of 8, as the // screen may not be. cameraResolution = new Point((screenResolution.x >> 3) << 3, (screenResolution.y >> 3) << 3); } return cameraResolution; }
另外在CameraManager中修改最大Frame的size也可以提高识别率
更改如下参数:
CameraManager.MAX_FRAME_WIDTH
CameraManager.MAX_FRAME_HEIGHT
1 0
- 【ANDROID】解决使用ZXING扫码,距离近无法识别的问题。
- ZXING扫码,距离近无法识别的问题
- 【Android】zxing扫码识别及生成二维码
- ios zxing扫码问题
- 使用zxing识别二维码时抛出com.google.zxing.NotFoundException异常问题的解决
- 使用 ZXing Android Embedded 实现二维码扫码
- Android二维码扫码--精简版zxing使用教程
- Android zxing连续扫码的功能实现
- Android二维码的生成与扫码-zxing
- Android 基于Zxing的扫码功能实现(二)
- ZXing 扫码 图片变形问题
- zxing打开扫码页面,黑屏问题
- Android Camera相关及zxing扫码
- Android Zxing 二维码扫码性能优化
- Android Zxing 二维码扫码性能优化
- Android Camera结合Zxing优化扫码
- 使用zxing扫码打开闪光灯
- Android解决Zxing识别GBK类型二维码出现乱码的问题
- SOAP-Simple Object Access Protocol(简单对象访问协议)
- 基于百度地图记录运动轨迹案例分析与实现
- 关于OC和Swift混编
- Servlet异常处理
- 几种常见排序算法
- 【ANDROID】解决使用ZXING扫码,距离近无法识别的问题。
- PullToRefresh第三方刷新控件使用总结
- request.sendRedirect(重定向)和request.getRequestDispatcher(请求转发)
- 触发器
- jquery,php实现文件下载和统计下载次数
- 刮刮卡效果
- 微信第三方网页授权关于回调域名的问题
- 130. Surrounded Regions
- 关于mmorpg游戏的压力测试