• 安卓扫码:简单的ZXing使用记录


    ZXing是Google提供的条形码、二维码等的生成、解析的库。最近工作需求去研究了一下,主要是研究怎么扫描二维码(QRCode)。网上教程也不少,但大多看了不明所以,甚至看了半天都不知道解码到底从哪儿下手。这篇文章仅作为一个补充,大体讲一下使用ZXing的流程,并不涉及具体代码。其实解码很简单的,只要知道大体的步骤,参照Google提供的Android上ZXing使用源码,很容易就明白。总之,明白关键节点后,我只用了几个类就实现了扫码器的基本功能。

    官方代码托管在GitHub上https://github.com/zxing/zxing/

    • 我习惯用IDEA+Gradle来开发,所以不喜欢网上那种把jar下载下来导入的方法(而且GitHub里也没提供jar包,你得自己下载几百兆的源码编译,或者下载前辈们精简好的jar包)。查Maven仓库(jcenter的),果然有现成的库。那么第一步,在build.gradle中添加下面两句依赖:

      compile 'com.google.zxing:core:3.2.1'
      compile 'com.google.zxing:android-core:3.2.1'

      第一句是导入ZXing核心库core.jar,第二句导入了一个Android的工具类。是的只有一个类,CameraConfigurationUtils,用于相机的配置。编译gradle,ok。

    接下来是使用咯,GitHub源码很多,随便翻翻,大致写几个关键的地方,方便供以后自己以及他人查询。

    • PlanarYUVLuminanceSource,在core.jar里,加工相机预览传回的byte[] data,得到要解析的source。为了得到它,可以参考官方GitHub源码中的Android部分的一个叫做CameraManager的类:https://github.com/zxing/zxing/blob/master/android/src/com/google/zxing/client/android/camera/CameraManager.java,里面有一个很关键的方法

      public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data);
      我是直接照搬了这个方法(以及它要用到的几个方法)。

    • CameraConfigurationUtils,在android-core.jar里,之前提到过的。里面有很多配置相机的工具方法。比如这个:

      public static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution);
      用于把screenResolution转化成cameraResolution。至于这俩Point类的实例干嘛的,随便翻翻基于ZXing的Android扫码器源码就知道了。

    • MultiFormatReader,在core.jar里,解码器的主要入口,解读二维码的关键步骤就是这个类的decode();、decodeWithState();方法。第二个需要事先用setHints();方法提供要解析的条码类型(格式)。俩方法的参数是一张二进制位图(BinaryBitmap),由PlanarYUVLuminanceSource的实例构建而来(

      BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(planarYUVLuminanceSource);
      )。

    • Result,也在core.jar里,com.google.zxing。作为MultiFormatReader的decode的返回结果容器。简单的使用result.getText();就可以获取到二维码内的信息。这里啰嗦几句,其实二维码就是数据的一种载体,用一定算法装载了一些信息,比如一条URL字符串。

    OK,就这样。总结一下解码过程:

    1. 每隔500ms获取一次相机预览传回的帧图。

    2. 开个线程,模仿或照搬Google的CameraManager里buildLuminanceSource();方法,把得到的帧图加工成PlanarYUVLuminanceSource。参数中会用到CameraConfigurationUtils的findBestPreviewSizeValue方法。

    3. 把(2)中得到的source转换成二进制位图,用MultiFormatReader解析它,得到Result结果容器。解码完成。

    这次不放自己的源码了,GitHub里已经有很多了,官方的Android工程实例就很好。https://github.com/zxing/zxing/tree/master/android

  • 相关阅读:
    【BZOJ3998】弦论(后缀自动机)
    【BZOJ4566】找相同字符(后缀自动机)
    AtomicInteger在实际项目中的应用
    ElasticSearchserver操作命令
    照猫画虎学gnuplot之折线图
    HDU 5667 :Sequence
    mycat 连续分片 -> 按日期(天)分片
    DM8168 unrecoverable error: OMX_ErrorBadParameter (0x80001005) [resolved]
    多线程(一):初识多线程
    Vb.net/VB 声明API函数实现父窗口功能
  • 原文地址:https://www.cnblogs.com/zhengxiaoyao0716/p/5914924.html
Copyright © 2020-2023  润新知