Android二维码扫描模块可简单集成(基于ZXIng实现)
一、该模块实现代码地址:https://github.com/M075097/MoZXing
相对于官方Demo,有以下特点:
- 1、修改横屏为竖屏,以及修改为竖屏后一维的条码识别依然需要横向扫描的问题
- 2、修改扫描区域的视图效果,模仿支付宝的网格扫描效果,也可根据自己需求做简单的定制
- 3、增加从相册选取图片识别的功能
- 4、移除解码过程中的定位及可能结果的展示回调
- 5、优化从相机调用到给出解码结果之间的调用,集成更简单
- 6、自测有限,代码健壮性需要提升
二、从ZXing源码开始(版本3.3.1)
2.1 ZXing的github地址:https://github.com/zxing/zxing
可以直接clone其仓库中的代码到本地,也可以直接下载https://github.com/zxing/zxing/releases页面的最新的打包源码。
以3.3.1版本为例,工程构建使用AndroidStudio
该源码中实际工程中需要用的是目录.\android及.\android-core及目录core下的代码。
其中android下的即是一个.\android的实例工程,该目录下的代码主要是提供一个扫码界面,并捕捉实时图片数据供解码使用,具体解码处理在.\core下的代码完成
.\android-core下只有一个文件:CameraConfigurationUtils.java,该文件作用是相机的相关属性设置类。我们可以直接copy到.\android下的合适位置
.\core下是ZXing解码的核心处理代码,我们可以直接编译该文件夹下的代码为一个jar,进行依赖,也可以直接在项目build.gradle中添加依赖: compile ‘com.google.zxing:core:3.3.1’
2.2 运行源码
本例用的是AndroidStudio,过程如下:
- 1.新建一个默认工程,把.\android 以module的形式导入该工程中,导入的时候直接使用默认转换,把原工程转化为一个AS工程
- 2.copy .\andriod-core下的文件CameraConfigurationUtils.java 到.\android下,这里我们copy到原路径相同的camera下。
在该Module下的build.gradle 中添加依赖:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.google.zxing:core:3.3.1' }
- 运行该工程即可
2.3 该官方Demo中我们一般需要改的地方:
- 1.官方Demo是横屏,我们需要更改为竖屏
- 2.官方的扫码,一般需要修改为方形,且扫码效果需要可自定义
- 3.官方Demo中再扫描过程中会回调并在扫描区域绘制出识别到的定位相关信息,实际中一般不需要,可以移除掉该功能
- 4.官方Demo中没有从相册的图片中识别二维码的示例(底层解码是支持的)
- 5.官方的Demo中从相机调用和图像展示以及解码三个部分界限不是很清楚,我们如果想集成到自己的工程中的时候略显繁琐
三、ZXing源码中主线的类图及时序图整理
3.1 ZXing Demo中的主要工作流程简单来说就是打开摄像头并在摄像头的预览回调中把数据传给解析核心,并把结果回传。解析内核的代码我们暂时不需要更改,但是可以拆开,以便更换解析内核,而我们的主要的工作是封装相机调用,并添加相册图片的识别和解析内核到一块以便我们自己简单的集成。
3.2 ZXing类图及说明
3.3 ZXing时序图
3.4 整个调用过程源码分析如下:
3.4.1 在打开CaptureActivity后,在onResume()中创建CameraManager类,并且在该类中创建Camera的PreviewCallback并创建Camera的参数设置管理类CameraConfigurationManager
CaptureActivity类代码如下:
<类CaptureActivity>
protected void onResume() {
super.onResume();
....
cameraManager = new CameraManager(getApplication());
....
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
Sur