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_FORMATSONE_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拍码后区分扫描到的是一维码、二维码、其他码相关推荐
- python wxpy登录微信,扫完二维码后,打开的软件没有关闭/ 扫二维码时不小心关闭了软件,程序会卡住不动的处理方法
加了几行代码,扫完二维码后,把打开图片的软件也结束程序 圈起来的代码是我改动后的!! 先找到login.py 追踪到打开图片的函数: 扫描结束后的函数: 这样的话,登录微信过程中,一旦发现显示二维码的 ...
- 视频怎么做成二维码扫描展示?在线视频生成二维码的技巧
现在很多二维码在扫描的时候,可以展现出视频的内容,那么视频转二维码(https://www.jzx.com/media)是如何操作的呢?其实方法很简单,通过电脑浏览器来操作在线二维码生成器工具,就可以 ...
- 数据转换成二维码并导出进Excel中和导入时解码二维码反转成数据
数据转换成二维码并导出进Excel中和导入时解码二维码反转成数据 第一步在maven中配置需要的二维码jar包 1.1 谷歌提供的帮助类 1.2 关于二维码的工具类 1.3 测试类 第二步 在Exce ...
- QR二维码生成器源码(中间可插入小图片)
二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维码. 我之前做了一个使用google开源项目zxing实现二维码.一维码编码解码的 ...
- 【黄啊码】PHP配合微信公众号生成推广二维码
前言 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 1.目前有2种类型的 ...
- 微信官方提供的生成二维码接口得到的是当前公众号的二维码
转自:http://blog.csdn.net/phil_jing/article/details/53910083 微信官方提供的生成二维码接口得到的是当前公众号的二维码,官方文档 目前有2种类型的 ...
- 微信官方提供的生成二维码接口得到的是当前公众号的二维码。
一定说明,这种方法我还没有测试,如果有疑问欢迎在评论区域讨论. .................... ................... 谢谢. 微信官方提供的生成二维码接口得到的是当前公众号 ...
- 二维码中加图片(打印带图片的二维码)
在二维码中,放入图片,遮挡一部分是被允许的. 二维码在少许损伤的情况下还可以读取出来,图片可以放置的位置如图的黄色区域.(具体可以放多大要看二维码生成时的纠错能力) 二维码的纠错级别: 纠错级别越高, ...
- 二维码太丑?用风格迁移生成个性二维码了解一下
文章选自arXiv,作者:Mingliang Xu等,机器之心编译 手机二维码太普通,换来换去还是不好看.何不自定义一个自己喜欢的呢?近日,郑州大学.浙江大学.微软亚洲研究院.北京航空航天大学的研究者 ...
- Python 二维码的读取与生成:使用链接生成二维码、读取二维码里的链接
Python 二维码的读取与生成演示 ① 使用链接生成二维码 ② 读取二维码里的链接 [ 文章推荐 ] Python 绘制中国地图:使用 pyecharts 最新版本绘制中国地图实例详解,个性化地图定 ...
最新文章
- 城市仿真为何成为大势所趋?
- ssh命令、ping命令、traceroute 命令所使用的协议
- LeetCode之First Unique Character in a String
- HDU 1203 I NEED A OFFER!(01背包)
- python线程安全的计数器_+ =运算符在Python中是线程安全的吗?
- Activity基础
- Cesium官方教程6--相机
- Java String类型数据的字节长度
- VS启动调试速度异常的缓慢问题
- 内部办公网与IDC机房的GRE隧道配置实践
- vue的边距怎么设置_Vue项目如何适应浏览器,去除容器控件与浏览器四周的距离...
- 人工神经网络分析方法,神经网络数据分析步骤
- 基于socket的联机五子棋
- eclipse python配置_Eclipse配置Python的IDE
- 20210326TCPandUDP
- 面试技巧--国企银行篇
- 日语在线翻译excite网页版
- transporter上传卡正在交付_Xcode11使用Transporter上传AppStore时卡住解决方式,亲测可用...
- 基于FFmpeg的音视频播放器
- Python3.8+OpenCV4 实现二维码扫码
热门文章
- Android设备读写NFC标签
- 虚拟化arm服务器,服务器虚拟化领域的ARM处理器与RISC技术
- 无线传感器网络(一)基于无锚节点的WSN系统设计
- FGUI手势案例代码
- RF模型(随机森林模型)详解
- 人脸识别库-于仕琪老师库地址
- Java解析HTML之NekoHTML
- 微信小程序 手写签名_【微信小程序canvas】实现小程序手写板用户签名(附代码)...
- eclipse ADT
- 解决maven打包 错误: 程序包com.sun.istack.internal不存在 - BBSMAX