Android(安卓)使用ZXing接入扫描二维码遇到的问题 近距离扫描失败 预览界面拉伸
16lz
2021-01-25
Android 使用ZXing接入扫描二维码遇到的问题 近距离扫描失败 预览界面拉伸
- 更新
- 前言
- 解决问题1----近距离扫描失败
- 解决问题2----预览界面拉伸
- 完事
更新
应用上线后,还是反馈在一些机型上会有扫描二维码过慢的问题!我测试了下,把下面的修改去掉,扫描二维码的速度就能恢复正常。
但这两个问题始终是个问题,我再找办法解决,解决后再更新。
解决方法:
android 扫描二维码 zxing-android-embedded 库使用
前言
截止2019.05.27的ZXing版本--------3.4.0
相关连接:android zxing demo 运行测试扫描生成二维码
在实际的项目中,简单的测试下,就能发现两个问题
1、近距离扫描基本不会成功,什么近距离呢,就是二维码刚好那个框的大小的时候;
2、预览界面宽高比和实际的影像宽高比不对应,甚至扭曲;
解决问题1----近距离扫描失败
参考链接:@SpringNowChris ---- Android Zxing3.3.2扫描、生成、解析二维码,以及近距离无法识别的问题
首先打开CameraManager
文件,找到buildLuminanceSource
方法
修改如下
可以直接复制下方代码替换
public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) { Rect rect = getFramingRectInPreview(); if (rect == null) { return null; } // Go ahead and assume it's YUV rather than die. /*return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top, rect.width(), rect.height(), false);*/ return new PlanarYUVLuminanceSource(data, width, height, 0, 0, width, height, false); }
原理解析:根据描述我们能知道这段方法是用来截取摄像头捕获图像的;
我们只需要把截取的位置放大即可,就能够获取到可能被剪裁掉的地方了,也就是增大了识别二维码的区域,上面修改的做法就是将整个页面都做成了识别区域,你也可以适当地调大一点,而不用整个区域。例如:
return new PlanarYUVLuminanceSource(data, width, height, rect.left - 20, rect.top - 20, rect.width() + 20, rect.height() + 20, false);
诸如此类。。。
解决问题2----预览界面拉伸
参考链接:@漠天515 ---- android Zxing扫码二维码拉伸解决
首先打开CameraConfigurationUtils
文件,找到findBestPreviewSizeValue
方法
修改最后的return部分代码
代码如下
// If there is nothing at all suitable, return current preview size Camera.Size defaultPreview = parameters.getPreviewSize(); if (defaultPreview == null) { throw new IllegalStateException("Parameters contained no preview size!"); } //修改的位置在这里,添加如下代码,替换defaultPreview return Point screenResolutionForCamera = new Point(); screenResolutionForCamera.x = screenResolution.x; screenResolutionForCamera.y = screenResolution.y; // preview size is always something like 480*320, other 320*480 if (screenResolution.x < screenResolution.y) { screenResolutionForCamera.x = screenResolution.y; screenResolutionForCamera.y = screenResolution.x; } Point cameraResolution = getCameraResolution(parameters, screenResolutionForCamera); Log.i(TAG, "No suitable preview sizes, using default: " + cameraResolution ); return cameraResolution ; //Point defaultSize = new Point(defaultPreview.width, defaultPreview.height); //Log.i(TAG, "No suitable preview sizes, using default: " + defaultSize); //return defaultSize;
还有加了一个方法
private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) { String previewSizeValueString = parameters.get("preview-size-values"); // saw this on Xperia if (previewSizeValueString == null) { previewSizeValueString = parameters.get("preview-size-value"); } Point cameraResolution = null; if (previewSizeValueString != null) { Log.e(TAG, "preview-size-values parameter: " + previewSizeValueString); cameraResolution = CameraConfigurationUtils.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; }
完事
更多相关文章
- android xml界面小技巧
- Android(安卓)UI用户界面开发辅助工具(值得一试)
- Android中GridView的使用——使用自带的SimpleAdapter(简单适配
- Android(安卓)Studio界面优化(UI插件)
- ListView的简单应用(一)
- Android(安卓)Fragment学习笔记(二)----Fragment界面添加和管理
- 仿写Android淘宝客户端界面(一)——仿Tab选项卡切换界面
- [随便写写]Android基础教程
- Android生成二维码--拍照或从相册选取图片