教你移植Zxing二维码,兼容Android6.0

几天的移植历程,以下是不断完善的过程

好多图片啊

解压出来文件目录如下,其中core为zxing的解码库,可以单独导入eclipse生成jar;android文件夹是整个安卓的核心,打开摄像头之类的都在此进行,android-core内面只有一个java文件,用来配置摄像头。

我并没有把core的文件都生成jar,因为直接放入Android studo也是毫无问题的,我把文件做成了一个库。在库中资源文件的id号不能用(反正不让我编译),直接换成静态int值算了。还有菜单都会报一些错的,不过没关系,后面都是要删的,按照Android studio的提示弄就可以了。

Android的东西在client目录下,我们动也只是动这里的代码,core的代码没必要搞。其中想wifi、share、history等的代码是没用的,因为我最想得到的只有两样东西,第一:扫描结果,第二:生成二维码。其他删除好了。

原来库是支持动态识别旋转的,但是这样的功能我觉得是没意义的,在扫码的时候转来转区更蛋疼,删掉好了,直接在manifest配置好了,万事大吉

下面我首先精简目录先,此时的摄像头数据在识别的时候还是横屏的,还需要改的,不过,不急,后面再搞它,现在目录太臃肿了,算,还是把core做成jar好了。。

直接把core的代码丢进去。工程编译不要选择jdk1.8,会出错的。。。选1.7,反正选1.8 Android studio不给我编译,我的版本是2.1.2是最新的。。。

直接导出所有,简单粗暴

然后放进Android studio的libs就可以了。

瞬间就只剩下安卓的东西了。现在,先把生成二维码搞出来先。

定位到是这个ShareActiviy就是跳转到生成二维码activity

二维码展示页面,剩下就开始删除了

像这么多隐式的条件是没有必要的,删除些,剩下生成二维码的隐式就行

最终确定下来就剩下三个页面:

第一个摄像头,第二个输入文字,第三个显示二维码

下一步,开始删除目录中多余的功能代码

Wifi目录直接删除,history(记录历史行为吧,没细看)也是直接删,clipboard剪切板,book(应该是搜索的,没细看)也不需要cut!,result中的supplement什么补充xxx貌似不需要,删!

第一次精简,费了很大的力气,删除了好多东西,终于能把所有东西显示了,后面还会再次精简!

现在着手解决下面图片的问题:

原来APP是横屏的,现在变成了竖屏,好像都挺正常,但是扫描就。。。

可以看出,数据还是横屏的,我们要做的是把竖屏的窗口映射到横屏上

先说一下整体流程:

1、初始化surfaceView,音频,扫描超时定时,手机震动

2、在surfaceCreated回调中初始化(打开硬件摄像头、计算分辨率、设置摄像头参数、计算分析二维码框的矩阵大小、设置摄像头预览数据回调、开启预览)

3、onPreviewFrame把摄像头的预览数据(数据是横屏的)通过sendmessage发送到DecodeThread

4、DecodeThread开启一个handler不断处理发送过来的数据(提取二维码矩形的数据,变黑白,识别) 处理后通过sendmessage发送到住UI线程处理

5、CaptureActivityHandler(UI的handler)的接收到正确的扫描结果,手机震动一下,“滴”一声,并通过setResult把数据返回

6、主应用程序收到相应数据进行显示

下面进入代码分析:

PreviewCallback是图片数据的获取回调,其中,onPreviewFrame()这个方法是就是直接得到byte的图片数据,通过这个方法,数据被发送到DecodeThread解码线程,不断的loop,这个解码线程是处理handler的线程,最终在DecodeHandler这个类中解码

PreviewCallback:

DecodeThread:

DecodeHandler:

里面重点的核心:private void decode(byte[] data, int width, int height)这就是解码函数

如果把传进来的数据一起解码的话,很浪费时间,所有红色框那条方法是用一个矩形,框住数据,解码只在矩形里面解,所以扫描的时候要对准那个框就是这样了。

所有现在需要解决映射问题就从那个函数入手了。

红色框就是 确定数据的矩形框。这中映射关系只是适合摄像头旋转90度的情况。

修改完毕!

虽然旋转了(横屏嘛),但是矩形计算正常。算是可以了

调整显示的矩形大小,位置,这里我修改了高度,与宽度一致

解码管理(由于可以解条形码等),我这里把多余的删除了,我不需要一维码,二维码就足够了。

但是还是不完美。如果我不想全屏,需要状态栏,如果改成有标题的,细心就发现原来1080*1920的数据挤压到1080*17xx(具体17多少忘了)的空间里,图形竖向被挤压了,如下图。

我就想,能不能不被挤压呢,因为这样看起啦不好看(我是完美主义),于是我想了一个简单方法,能不能只显示一部分呢,因为扫码根本不需要看到全部,于是就这样,把surfaceView强制设置高度,这样虽然图像少了一些,但是起码是不会被拉伸了。(有更好的方法求支招)

后面研究研究,又发现了两个致命问题。代码是根据横屏来写的,在寻找最合适了分辨率上是不对了,需要改一改,主要是把x与y交换,因为横屏 x比y长,竖屏y比x长。

修改的就是这个方法下面的两处地方。

第二个问题就是,摄像头的旋转问题,我的手机一部是旋转90度,一部是旋转270度的,在识别的时候就需要判断,不然会出现奇葩问题的。0度与180没实测过,没手机。

最后,基本把问题解决啦,把它做成了一个包,把填写二维码的页面也删除了,剩下一个扫描activity跟一个二维码展示activity。

下面就效果:

连续改了很久,很累,代码肯定有冗余,凑合看吧

<重点>工程代码:http://download.csdn.net/detail/a756213932/9574643

时间: 2024-07-31 06:53:42

教你移植Zxing二维码,兼容Android6.0的相关文章

教你不扫二维码不查找公众账号就能一键关注公众账号的方法

第一步:先设置广告编辑 第二步:选择广告模式和微信一键关注 这张图设置好后,需要打印张贴在店里引导客人上网. 上网方法: 1.  手机线连接wifi 2.  打开危险性朋友圈点击任意分线箱连接或扫一扫二维码 3.  点击一键关注 手机端操作: 1.连接wifi 2.打开微信——朋友圈 3.点击任意分享连接 4.出现一键关注界面 5.点击关注 6.点击确定 最后跳转到分享连接内容 现在手机的网络已经完全打开 教你不扫二维码不查找公众账号就能一键关注公众账号的方法,布布扣,bubuko.com

Android项目实战(二十八):Zxing二维码实现及优化

原文:Android项目实战(二十八):Zxing二维码实现及优化 前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的jar包,使用简化版的即可,下文可见. 这篇文章讲述:1.如果快速在项目中集成zxing,实现扫描和生成二维码功能 2.根据项目需求去修改源码实现我们的要求并进行优化 一.快速集成zxing二维码 1.下载库文件 : http://do

Android项目实战(四十四):Zxing二维码切换横屏扫描

原文:Android项目实战(四十四):Zxing二维码切换横屏扫描 Demo链接 默认是竖屏扫描,但是当我们在清单文件中配置横屏显示的时候: <activity android:name=".CaptureActivity" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 这时候扫描

自定义ZXing二维码扫描界面并解决取景框拉伸等问题

先看效果 扫描内容是下面这张,二维码是用zxing库生成的 由于改了好几个类,还是去年的事都忘得差不多了,所以只能上这个类的代码了,主要就是改了这个CaptureActivity.java 1 package com.zxing.activity; 2 3 import java.io.IOException; 4 import java.util.Vector; 5 6 import android.app.Activity; 7 import android.content.Intent;

Atitit zxing二维码qr码识别解析

1.1. qr码识别解析 by zxing1 1.2. 解码lib:qrcode.jar  2 1.3. atitit.二维码生成总结java zxing 2 1.1. qr码识别解析 by zxing /AtiPlatf_ee/src/com/attilax/qrcode/qrcodex.java public static String decode(String imagePath) { String contents = null; MultiFormatReader formatRea

Zxing二维码扫描

网络上关于zxing的扫描解码这块儿的东西大多都是 基于zxing自带项目修改过来的, 而且项目里面代码太多且繁杂. 索性自己基于zxing开发了个demo代码量瞬间就少了下来,  如果要基于横屏,自己修改下代码应该会很快 项目源码 http://download.csdn.net/detail/nie312122330/8136373 自定义扫描区域如图 1.ZxingBarCodeActivity扫描界面 package com.xiaoqiang.zxing; import java.ut

ZXing 二维码应用

1.导入zxing代码和包 2.下面的类是解析二维码的主要类. package com.gaint.nebula.interaction.ui.zxing; import java.io.IOException; import java.util.Vector; import android.app.Activity; import android.content.Intent; import android.content.res.AssetFileDescriptor; import and

运行Google 官方zxing二维码扫描器

首先,要去下载Zxing的源码,由于Zxing 的服务内容比较广,我们先把所有的源码都下载下来,使用的时候根据需要加载. 或者从开源中国下载https://www.oschina.net/question/tag/zxing 下载好的zip 提取里面的文件之后是 我们需要的文件已经被标出来了,其中core文件需要打包成jar,但是由于Android studio 打包jar比较麻烦,所以我们可以直接从网上下载别人打包好的,但是需要注意版本 这里我们给出一个下载core jar 包的地址http:

ZXing二维码生成在Unity3D中出错,数组超出界限的解决办法

错误截图: IndexOutOfRangeException: Array index is out of range.ZXing.Color32Renderer.Render (ZXing.Common.BitMatrix matrix, BarcodeFormat format, System.String content, ZXing.Common.EncodingOptions options)ZXing.BarcodeWriterGeneric`1[TOutput].Write (Sy