关于如何在代码里区分条码扫描扫描到是是一维码还二维码
2013-06-20 16:05
351 查看
以前没有搞过二维码,最近遇到一个问题,如何判断条码扫描扫描到的是一维码还是二维码,这下可把我吓到了,说实话这个还真不知道,经过几个小时的艰苦奋斗,终于让我解决了,也许方法有很多种,或许并不是只有我这一种实现方法,所以跟大家分享一下,希望大家能多提些意见。如果大家有其他的实现方法也请告诉我哦。
关键的三个类,CaptureActivity、DecodeThread、DecodeFormatManager
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了,记得要迭代哦。
关键的三个类,CaptureActivity、DecodeThread、DecodeFormatManager
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了,记得要迭代哦。
相关文章推荐
- 如何在代码里区分条码扫描扫描到是是一维码还二维码
- ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码
- ZXing拍码后区分扫描到的是一维码、二维码、其他码
- 二维码生成与扫描,二维码在开发中是非常常用的,本例子写的很明了,包分的很清楚,用的时候只要改变BarCodeTestActivity中的相关代码,其他的包直接复制就行了
- 修改zxing连续扫描条码和二维码的怪问题
- iOS 7以上原生二维码、条码扫描(ZXingObjC相册读取)
- 关于单元测试,如何写出可测试的代码?
- 一个关于js代码如何获取服务器时间问题
- 关于如何加快C++代码的编译速度
- 关于扫描二维码下载app功能实现方法
- iOS如何实现扫描二维码
- 关于android view属性的归属以及如何在代码中设置相关属性总结
- android 数行代码集成二维码扫描识别功能
- 设备如何区分BOOTP和DHCP代码的,写单片机底层DHCP协议的时候的一点记录
- 如何用 Sonar 进行静态代码扫描
- 关于如何让VC6.0 VS代码编辑具有智能提醒功能的软件Visual Assist X
- iOS.swift 纯代码 关于如何提取TableViewCell视图作为view
- ZPL 打印条码、二维码及小票(中文/汉字),生成条码、二维码图片【Asp.Net】-含示例代码
- 关于如何读懂别人的代码以及如何提高代码可读性的研究
- 关于sublime text3 格式化代码快捷方式的添加和如何破解sublime text3