安卓扫码:简单的ZXing使用记录
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,就这样。总结一下解码过程:
每隔500ms获取一次相机预览传回的帧图。
开个线程,模仿或照搬Google的CameraManager里buildLuminanceSource();方法,把得到的帧图加工成PlanarYUVLuminanceSource。参数中会用到CameraConfigurationUtils的findBestPreviewSizeValue方法。
把(2)中得到的source转换成二进制位图,用MultiFormatReader解析它,得到Result结果容器。解码完成。
这次不放自己的源码了,GitHub里已经有很多了,官方的Android工程实例就很好。https://github.com/zxing/zxing/tree/master/android
安卓扫码:简单的ZXing使用记录的更多相关文章
- Android | 带你零代码实现安卓扫码功能
目录 小序 背景介绍 前期准备 开始搬运 结语 小序 这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用一个扫码demo,华为scankit真是新手的福音-- ...
- iOS ZBar扫码简单实现
导入ZBarSDK文件并引入一下框架 AVFoundation.framework CoreMedia.framework CoreVideo.framework QuartzCore.framewo ...
- C#-Xamarin利用ZXing.Net.Mobile进行扫码
前言 很多人觉得Xamarin的开源少,没法用来开发项目. 但,实际上Xamarin已经有很多开源代码了:只要不是特别特殊的项目,基本上是都可以满足开发. 下面我们来看一下Xamarin中利用开源代码 ...
- zxing扫码--镭射线
同步发表于http://avenwu.net/2015/09/15/zxing_view_finder_laser 在很多应用中都有二维码扫描的需求,比如微信,通过扫描电脑二维码,实现用户登录授权: ...
- 记录:c#实现微信,支付宝扫码支付(一)
因为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能. 微信支付分为6种支付模式:1.付款码支付,2.native支付,3.jsapi支付,4.a ...
- 超简单集成HMS Scan Kit扫码SDK,轻松实现扫码购
前言 在前面的文章中,我们向大家介绍了HMS Scan Kit 的快速集成方法以及HMS Scan Kit和其他开源扫码工具的竞争力对比分析,如果没有看到也没关系,文章下方的往期链接中有文章入口. ...
- ZXing Blazor 扫码组件 , ssr/wasm通用
项目介绍 本项目是利用 ZXing 进行封装的 Blazor 组件库 直接调用手机或者桌面电脑摄像头进行扫码 项目截图 项目地址 https://github.com/den ...
- zxing 扫码第三方SDK版本不兼容问题
在AndroidStudio环境下,或许会遇到下面的问题: Error:Execution failed for task ':app:preDebugAndroidTestBuild'. > ...
- 二维码扫码登录原理及简单demo
扫码登录原理转载自: https://www.cnblogs.com/liyasong/p/saoma.html 需求介绍 首先,介绍下什么是扫码登录.现在,大部分同学手机上都装有qq和淘宝,天猫等这 ...
随机推荐
- SQL 左外连接查询 将右表中的多行变为左表的一列或多列
示例: --行列互转 /**************************************************************************************** ...
- orcad中的PSpice仿真加入厂商模型
<1>首先要知道原理图的符号是没有模型的,不是你肆意妄为就可以拉来仿真的. <2>其次要知道很多器件软件中是没有模型的. <3>有很多获取模型的方法:<使 ...
- 转:SSE:服务器发送事件
原文来自于:http://javascript.ruanyifeng.com/htmlapi/eventsource.html 目录 概述 客户端代码 概述 建立连接 open事件 message事件 ...
- 转:gpio_request
今天再次学习SD卡驱动,遇到pgio_request这个函数,始终不知道其什么意思,看了几遍源代码才有了点感觉.现将其关键部分再此说明一下,以备自己以后复习,或是路客参考. 一般gpio_reques ...
- Java Socket Example
1.服务端:server package com.socket; import java.io.BufferedReader; import java.io.IOException; import j ...
- Extjs通过structs2生成树结构
Extjs为我们提供了强大的树的生成方式,我们不必通过原始的js去生成树形结构.在这里我做了一个简单的树结构生成.代码如下,同时在后台使用了fastjson-1.1.15.jar的jar包生成json ...
- c++ explicit
C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c++类 ...
- 《深入Linux内核》 UNIX的一些故事
Unix文件的类型1.普通文件2.目录3.符号链接4.面向块的设备文件5.面向字符的设备文件6.管道和命名管道7.套接字 点评:不明觉厉 打开文件进程只能访问“打开的”文件.为了打开一个文件,进程调用 ...
- (转载)教你在PHP中使用全局变量
(转载)http://www.chinaz.com/program/2009/0123/64261.shtml 即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你 ...
- VK Cup 2015 - Round 1 -E. Rooks and Rectangles 线段树最值+扫描线
题意: n * m的棋盘, k个位置有"rook"(车),q次询问,问是否询问的方块内是否每一行都有一个车或者每一列都有一个车? 满足一个即可 先考虑第一种情况, 第二种类似,sw ...