首页 > 代码库 > ZXing拍码后区分扫描到的是一维码、二维码、其他码
ZXing拍码后区分扫描到的是一维码、二维码、其他码
以前没有怎么接触过二维码,最近遇到一个问题,如何判断条码扫描到的是一维码还是二维码,经过自己艰苦奋斗一下午,加上网上查询资料,
总结出两种方式可以解决该问题(推荐采用第二种方式):
1.修改源码(具体后面会提到)
2.通过返回的编码来判断实现方式一:
源码的修改,关键涉及到三个类,CaptureActivity、DecodeThread、DecodeFormatManager
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_CODE和DATA_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拍码后区分扫描到的是一维码、二维码、其他码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。