Android 使用ZXing接入扫描二维码遇到的问题 近距离扫描失败 预览界面拉伸
更新
应用上线后,还是反馈在一些机型上会有扫描二维码过慢的问题!我测试了下,把下面的修改去掉,扫描二维码的速度就能恢复正常。
但这两个问题始终是个问题,我再找办法解决,解决后再更新。
解决方法:
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;
}