如何在代码里区分条码扫描扫描到是是一维码还二维码

来源:互联网 发布:1元云购源码 编辑:程序博客网 时间:2024/05/01 09:50

以前没有搞过二维码,最近遇到一个问题,如何判断条码扫描扫描到的是一维码还是二维码,这下可把我吓到了,说实话这个还真不知道,经过几个小时的艰苦奋斗,终于让我解决了,也许方法有很多种,或许并不是只有我这一种实现方法,所以跟大家分享一下,希望大家能多提些意见。如果大家有其他的实现方法也请告诉我哦。

关键的三个类,CaptureActivityDecodeThreadDecodeFormatManager


1.首先让我们来看下Zxing的源码,里面有一个DecodeFormatManager编码管理类:
该来原本的final类,因为需要用到该类里的一些参数,所以要把它变成普通类,但是不知道这样改变以后对原本的代码结构是否有影响,目前测试的时候没有遇到这个问题。还有就是有几个变量也是常量型的,这里要都要改成static类型的:
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 {
  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);
  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_FORMATS.add(BarcodeFormat.QR_CODE);
  DATA_MATRIX_FORMATS = new Vector<BarcodeFormat>(1);
  DATA_MATRIX_FORMATS.add(BarcodeFormat.DATA_MATRIX);
}


相信到这里大家应该都能看懂吧!不需要我多做解释了,这里主要就是把一些常用的条码格式给添加到一个向量里面,其中有一维码、二维码等。最后一个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源码相信大家都能下到,也知道扫描后返回的值,如果不知道的话,后面再好我好了。里面有一个handlerCode方法,返回的值就是在这里:
// 扫描后的结果
txtResult.setText(obj.getBarcodeFormat().toString() + ":"
   + obj.getText());


关键是这一句话:obj.getBarcodeFormat().toString()返回的就是编码格式;
obj.geText();返回的才是扫描的值。
所以,我们主需要判断之前的编码管理类里的向量数组是否包含这个字段就OK了,记得要迭代哦。

好了,就到这里了,如果还有扫描疑问的话,请留言吧!

原创粉丝点击