首页 > 代码库 > ZXing拍码后区分扫描到的是一维码、二维码、其他码

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标示来判断实行那些操作了



部分条码规则:


ZXing拍码后区分扫描到的是一维码、二维码、其他码