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;  }

完事

更多相关文章

  1. android xml界面小技巧
  2. Android(安卓)UI用户界面开发辅助工具(值得一试)
  3. Android中GridView的使用——使用自带的SimpleAdapter(简单适配
  4. Android(安卓)Studio界面优化(UI插件)
  5. ListView的简单应用(一)
  6. Android(安卓)Fragment学习笔记(二)----Fragment界面添加和管理
  7. 仿写Android淘宝客户端界面(一)——仿Tab选项卡切换界面
  8. [随便写写]Android基础教程
  9. Android生成二维码--拍照或从相册选取图片

随机推荐

  1. Android中gravity与layout_gravity的区别
  2. Android之drawable state各个属性详解
  3. 【Android】TabHost与RadioGroup结合完成
  4. android:shape
  5. Android异步处理系列文章四篇之一使用Thr
  6. Android常见知识汇总
  7. Android异步任务
  8. Android架构分析之Android驱动程序开发
  9. Android跨进程通信IPC系列
  10. Android(安卓)如何将一个Activity设置成