安卓扫码:简单的ZXing使用记录

时间:2021-12-24 14:37:08

ZXing是Google提供的条形码、二维码等的生成、解析的库。最近工作需求去研究了一下,主要是研究怎么扫描二维码(QRCode)。网上教程也不少,但大多看了不明所以,甚至看了半天都不知道解码到底从哪儿下手。这篇文章仅作为一个补充,大体讲一下使用ZXing的流程,并不涉及具体代码。其实解码很简单的,只要知道大体的步骤,参照Google提供的Android上ZXing使用源码,很容易就明白。总之,明白关键节点后,我只用了几个类就实现了扫码器的基本功能。

官方代码托管在GitHub上https://github.com/zxing/zxing/

  • 我习惯用IDEA+Gradle来开发,所以不喜欢网上那种把jar下载下来导入的方法(而且GitHub里也没提供jar包,你得自己下载几百兆的源码编译,或者下载前辈们精简好的jar包)。查Maven仓库(jcenter的),果然有现成的库。那么第一步,在build.gradle中添加下面两句依赖:

    compile 'com.google.zxing:core:3.2.1'
    compile 'com.google.zxing:android-core:3.2.1'

    第一句是导入ZXing核心库core.jar,第二句导入了一个Android的工具类。是的只有一个类,CameraConfigurationUtils,用于相机的配置。编译gradle,ok。

接下来是使用咯,GitHub源码很多,随便翻翻,大致写几个关键的地方,方便供以后自己以及他人查询。

  • PlanarYUVLuminanceSource,在core.jar里,加工相机预览传回的byte[] data,得到要解析的source。为了得到它,可以参考官方GitHub源码中的Android部分的一个叫做CameraManager的类:https://github.com/zxing/zxing/blob/master/android/src/com/google/zxing/client/android/camera/CameraManager.java,里面有一个很关键的方法

    public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data);

    我是直接照搬了这个方法(以及它要用到的几个方法)。

  • CameraConfigurationUtils,在android-core.jar里,之前提到过的。里面有很多配置相机的工具方法。比如这个:

    public static Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution);

    用于把screenResolution转化成cameraResolution。至于这俩Point类的实例干嘛的,随便翻翻基于ZXing的Android扫码器源码就知道了。

  • MultiFormatReader,在core.jar里,解码器的主要入口,解读二维码的关键步骤就是这个类的decode();、decodeWithState();方法。第二个需要事先用setHints();方法提供要解析的条码类型(格式)。俩方法的参数是一张二进制位图(BinaryBitmap),由PlanarYUVLuminanceSource的实例构建而来(

    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(planarYUVLuminanceSource);

    )。

  • Result,也在core.jar里,com.google.zxing。作为MultiFormatReader的decode的返回结果容器。简单的使用result.getText();就可以获取到二维码内的信息。这里啰嗦几句,其实二维码就是数据的一种载体,用一定算法装载了一些信息,比如一条URL字符串。

OK,就这样。总结一下解码过程:

  1. 每隔500ms获取一次相机预览传回的帧图。

  2. 开个线程,模仿或照搬Google的CameraManager里buildLuminanceSource();方法,把得到的帧图加工成PlanarYUVLuminanceSource。参数中会用到CameraConfigurationUtils的findBestPreviewSizeValue方法。

  3. 把(2)中得到的source转换成二进制位图,用MultiFormatReader解析它,得到Result结果容器。解码完成。

这次不放自己的源码了,GitHub里已经有很多了,官方的Android工程实例就很好。https://github.com/zxing/zxing/tree/master/android

安卓扫码:简单的ZXing使用记录的更多相关文章

  1. Android | 带你零代码实现安卓扫码功能

    目录 小序 背景介绍 前期准备 开始搬运 结语 小序   这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用一个扫码demo,华为scankit真是新手的福音-- ...

  2. iOS ZBar扫码简单实现

    导入ZBarSDK文件并引入一下框架 AVFoundation.framework CoreMedia.framework CoreVideo.framework QuartzCore.framewo ...

  3. C#-Xamarin利用ZXing.Net.Mobile进行扫码

    前言 很多人觉得Xamarin的开源少,没法用来开发项目. 但,实际上Xamarin已经有很多开源代码了:只要不是特别特殊的项目,基本上是都可以满足开发. 下面我们来看一下Xamarin中利用开源代码 ...

  4. zxing扫码--镭射线

    同步发表于http://avenwu.net/2015/09/15/zxing_view_finder_laser 在很多应用中都有二维码扫描的需求,比如微信,通过扫描电脑二维码,实现用户登录授权: ...

  5. 记录:c#实现微信,支付宝扫码支付(一)

    因为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.a ...

  6. 超简单集成HMS Scan Kit扫码SDK,轻松实现扫码购

    前言   在前面的文章中,我们向大家介绍了HMS Scan Kit 的快速集成方法以及HMS Scan Kit和其他开源扫码工具的竞争力对比分析,如果没有看到也没关系,文章下方的往期链接中有文章入口. ...

  7. zxing 扫码第三方SDK版本不兼容问题

    在AndroidStudio环境下,或许会遇到下面的问题: Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > ...

  8. 二维码扫码登录原理及简单demo

    扫码登录原理转载自: https://www.cnblogs.com/liyasong/p/saoma.html 需求介绍 首先,介绍下什么是扫码登录.现在,大部分同学手机上都装有qq和淘宝,天猫等这 ...

  9. 快开宝PDA开单器出入库扫码:让批发零售变得更简单

    快开宝PDA开单器出现前 批发商户是这样开单和管理的 ★员工痛苦:需要记客户.价格.库存等等,应对报错价.错漏单.盘错货等各种状况. ★老板麻烦:每天要守店.对单.核账,经常因错漏单.库存乱.积压货. ...

随机推荐

  1. 部署搭建 Saltstack(centos6.6)

    SaltStack介绍 官网:https://docs.saltstack.com/en/latest/ 中国saltstack用户组http://www.saltstack.cn/ 下图是它的子系统 ...

  2. [Effective JavaScript 笔记]第49条:数组迭代要优先使用for循环而不是for...in循环

    示例 下面代码中mean的输出值是多少? var scores=[98,74,85,77,93,100,89]; var total=0; for(var score in scores){ tota ...

  3. 编译为 Release 与 Debug 的区别

    class Program { static void Main(string[] args) { DoWork(); } static void DoWork() { new Person().Ru ...

  4. 查看服务器的TCP/IP(http)连接情况

    6.那具体到,怎样监听一个具体程序的TCP/IP连接情况呢???!! 就要用:netstat -n|grep 80 命令来查看具体端口对应程序的TCP/IP连接情况了 netstat -n|grep ...

  5. J2EE到底是什么

    目前所有的B/S系统应用可以分为:有状态(statefull)和无状态(stateless)两大类别. 有状态是指在整个系统的处理过程中要保留记住一些信息,而无状态则相反,每次request都是独立的 ...

  6. fastjson使用示例

    一.fastjson 一款Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser.包括 ...

  7. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一 ...

  8. python 生产者 --- 消费者

    值得拿出来 看看的 多进程 爬取 (生产) , 解析 (消费) 网页 同时进行,可以作为以后项目扩展使用 from bs4 import BeautifulSoup import requests i ...

  9. SpringBoot-简单实例

    在进行实例之前,首先须确保电脑环境变量已经配置好,包括jdk.maven.此文章不做描述,不清楚自行百度. 第一步:来到springboot官网(https://start.spring.io/)下载 ...

  10. 2018.12.17 ural1132 Square Root(二次剩余)

    传送门 MD写一道二次剩余的板题差点写自闭了. 我用的是cipollacipollacipolla算法. 利用的是欧拉准则来找寻一个二次非剩余类来求根. 注意这题有两个等根和模数为2的情况. 代码: ...