zoukankan      html  css  js  c++  java
  • ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码

    我怎么有二维码没有联系,最近遇到一个问题,,如何推断条码扫描到一维代码或者二维代码,辛苦了一个下午下班后自己,加上网上跟踪信息。

    总结出两种方式能够解决该问题(推荐採用另外一种方式):

    1.改动源代码(详细后面会提到)

    2.通过返回的编码来推断

    实现方式一:

    源代码的改动,关键涉及到三个类,CaptureActivityDecodeThreadDecodeFormatManager


    1.首先让我们来看下Zxing的源代码。里面有一个DecodeFormatManager编码管理类:该来原本的final类,由于须要用到该类里的一些參数,所以要把它变成普通类,可是不知道这样改变以后对原本的代码结构是否有影响。

    还有就是有几个变量也是常量型的,这里要都要改成static类型的:


    public class DecodeFormatManager {
    //final class DecodeFormatManager {
    public static Vector<BarcodeFormat> PRODUCT_FORMATS;
    public static Vector<BarcodeFormat> ONE_D_FORMATS;
    public static Vector<BarcodeFormat> QR_CODE_FORMATS;
    public static Vector<BarcodeFormat> DATA_MATRIX_FORMATS;
    
    
    //static final Vector<BarcodeFormat> PRODUCT_FORMATS;
    //static final Vector<BarcodeFormat> ONE_D_FORMATS;
    //static final Vector<BarcodeFormat> QR_CODE_FORMATS;
    //static final Vector<BarcodeFormat> DATA_MATRIX_FORMATS;
    
    
    static {
      PRODUCT_FORMATS = new Vector<BarcodeFormat>(5);
      PRODUCT_FORMATS.add(BarcodeFormat.UPC_A);   // UPC标准码(通用商品)
      PRODUCT_FORMATS.add(BarcodeFormat.UPC_E);   // UPC缩短码(商品短码)
      PRODUCT_FORMATS.add(BarcodeFormat.EAN_13);  
      PRODUCT_FORMATS.add(BarcodeFormat.EAN_8);
      PRODUCT_FORMATS.add(BarcodeFormat.RSS14);
    
    
      ONE_D_FORMATS = new Vector<BarcodeFormat>(PRODUCT_FORMATS.size() + 4);
      ONE_D_FORMATS.addAll(PRODUCT_FORMATS);	//此处将PRODUCT_FORMATS中加入的码加入到ONE_D_FORMATS
      ONE_D_FORMATS.add(BarcodeFormat.CODE_39);
      ONE_D_FORMATS.add(BarcodeFormat.CODE_93);
      ONE_D_FORMATS.add(BarcodeFormat.CODE_128);
      ONE_D_FORMATS.add(BarcodeFormat.ITF);
    
    
      QR_CODE_FORMATS = new Vector<BarcodeFormat>(1);//QR_CODE即二维码
      QR_CODE_FORMATS.add(BarcodeFormat.QR_CODE);
    
    
      DATA_MATRIX_FORMATS = new Vector<BarcodeFormat>(1);
      DATA_MATRIX_FORMATS.add(BarcodeFormat.DATA_MATRIX);//也属于一种二维码
    	}
    }

    该类中主要就是把一些经常使用的条码格式给加入到Vector<BarcodeFormat>集合里面,当中有一维码、二维码等。

    最后一个DATA_MATRIX这个也属于是一种二维码。



    2.上面的改动完了一会,然后是DecodeThread。这个是解码类

    这里不须要我们做什么操作,仅仅要知道这里是怎样解码的即可了,关键的地方就是这里:

    if (decodeFormats == null || decodeFormats.isEmpty()) {
          decodeFormats = new Vector<BarcodeFormat>();
          decodeFormats.addAll(DecodeFormatManager.ONE_D_FORMATS);  // 一维码
          decodeFormats.addAll(DecodeFormatManager.QR_CODE_FORMATS);  // 二维码
          decodeFormats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
          
        }


    这里把之前加入好的几个常量类,加入到解码的方法里面去,这样解码方法里面就有了全部的解码格式了。包含一维码和二维码。

    3.关键的地方来了。CaptureActivity,扫描后返回信息的类。

    Zxing源代码相信大家都能下到,也知道扫描后返回的值,里面有一个public void handleDecode(Result result, Bitmap barcode);方法,

    返回的值就是在这里:


    // 扫描后的结果  和  编码
    Log.e("编码: ------>",result.getBarcodeFormat().toString()+"   数据:"+result.getText());



    关键是这一句话:

    result.getBarcodeFormat().toString()  返回的就是编码格式。

    result.getText();  返回的才是扫描的值。

    所以,我们主须要推断之前的编码管理类里的向量数组是否包括这个字段就OK了,迭代:


    	/**********************************************
                 * 注:此处依据  拍码后返回的编码格式  与  DecodeFormatManager
                 * 类中的二维码     编码格式    进行对照
                 *
                 * 同样则将标示字段赋值为1(即一维码)
                 * 否者则将标示字段赋值为2(即二维码)
                 **********************************************/
                 int size = DecodeFormatManager.ONE_D_FORMATS.size();            //遍历一维码字符集
                for (int i = 0; i < size; i++) {
                    Log.e(" 一维码编码格式 ------>",DecodeFormatManager.ONE_D_FORMATS.get(i)+"");
                    //此处依据  拍码后返回的编码格式  与  DecodeFormatManager类中的一维码 编码格式  进行对照
                    //同样则将标示字段赋值为1(即一维码)      否者将标示字段赋值为2(即二维码)
                    if(DecodeFormatManager.ONE_D_FORMATS.get(i).equals(mBarcodeFormat)){
                        ONE_D_FORMATS = 1;
                    }else {
                        QR_CODE_FORMATS = 2;
                    }
                }



    实现方式二:

    public void handleDecode(Result result, Bitmap barcode);方法中加入两个常量,自己定义QR_CODEDATA_MATRIX两个常量码,然后当扫描返回时。通过result.getBarcodeFormat().toString()获得返回编码。再依据该返回码与自己定义的编码去比对。然后定义个字符串或int变量作为标示,例如以下:

      int CODE_TYPE = -1;      //标示 (1一维码、 2、二维码   3、其它码)
            final String QR_CODE = "QR_CODE";           //二维码
            final String DATA_MATRIX = "DATA_MATRIX";   //其它码
    
    
            //扫描获取的 编码 不为空
            if(!TextUtils.isEmpty(result.getBarcodeFormat().toString())){
    
                String mBarcodeFormat = result.getBarcodeFormat().toString();                   //拍码后返回的编码格式
    
                if(mBarcodeFormat.equals(DATA_MATRIX)){
                    CODE_TYPE = 3;
                }else if(mBarcodeFormat.equals(QR_CODE)){
                    CODE_TYPE = 2;
                }else {
                    CODE_TYPE = 1;
                }
            Log.e("---> (1一维码、  2、二维码    3、其它码) ",""+CODE_TYPE);

    接着后面就能够 switch 这个CODE_TYPE标示来推断实行那些操作了



    部分条码规则:


  • 相关阅读:
    创建vue项目的时候报错,spawn yarn ENOENT
    理解比特币(4)——实现原理
    比特币(3)——比特币的其他优势
    比特币(2)——最大优势是价值存储
    如何在K8S中优雅的使用私有镜像库 (Docker版)
    [Go] godoc 打开本地文档, windows 同样适用
    [FAQ] Golang error strings should not be capitalized or end with punctuation
    [Go] gorm 错误处理 与 链式/Finisher方法
    [Go] golang 替换组件包 更新 go.mod, go.sum 的方式
    [FAQ] golang-migrate/migrate error: migration failed in line 0: (details: Error 1065: Query was empty)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5049261.html
Copyright © 2011-2022 走看看