参考http://my.oschina.net/jeffzhao/blog/107658,但是他下载的是2.1版本的,我下载的是2.2版本的,有点出入,解决方法请看最下面。
项目需求,做一个类似微信扫描二维码,网页端登陆的功能实现。
利用开源项目ZXing来实现。ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。
ZXing主页:http://code.google.com/p/zxing/
1.Download
下载ZXing-2.1,解压后找到所需要的文件夹:core 和 android。core是核心库,android是在android平台下的二维码扫描实现源码
2.Build
在ZXing-2.1下面有不同平台实现方式的文件夹,每个下面都有一个名为build.xml的Ant编译文件。首先我们利用Ant工具和这个文件,将core编译成所需要的库。如果你没有Ant,可以去http://ant.apache.org下载(mac下默认已经安装)。编译很简单,直接cd到core目录,然后ant即可:
1 | cd core |
2 | ant |
导入android工程,然后将编译好的core.lib 添加到工程中
我已经将我编译好的lib和Barcode Scanner 4.3.1工程放到github,可以直接下载运行
Barcode Scanner 4.3.1: https://github.com/jeffzhao/ZXing-Android
https://github.com/JeffreyZH/ZXingSimple
4.简化工程
Barcode Scanner 4.3.1的工程很丰满,如果单实现扫描二维码获取编码可以简化工程
我简化的工程demo ZXingSimple :https://github.com/jeffzhao/ZXingSimple
去掉了本地数据库,分享,配置等功能,只保留了二维码扫描和生成功能。但还是建议看完整工程代码,很有帮助
5.扫描登入实现
扫描成功了,那么就先通知服务器端,扫描成功,页面也会即时展示出扫描成功,等待手机确认登录的信息
接下来,如果点确认登录,则通知服务器确认登录。
private final static StringSCANNED_URL ="http://192.168.111.109:8000/scanned?";
privatefinalstatic StringCONFIRMLOGIN_URL ="http://192.168.111.109:8000/confirmed?";
一个是通知服务器已经成功扫描的http接口,一个是通知服务器确认登录的接口。参数都是sessionID,也就是二维码带的信息,和用户token。
参考文章:
主流手机二维码PK——QR 与 DM :http://www.ancc.org.cn/news/article.aspx?id=3693
vCard 和 meCard 的区别:http://www.devicemedia.ca/blog/whats-the-difference-between-a-vcard-and-a-mecard/
按照上面这位兄弟的方法现在下载以后,没发现到core下面有build.xml文件,一开始想用他编译好的core.jar算了,但是导入后发现还是有问题,因为我下载的版本是2.2版的,后来在stackoverflow找到了解决方法,自己创建一个build.xml文件,内容如下
http://stackoverflow.com/questions/16857294/importing-zxing-missing-core-build-xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="project" default="jar" basedir=".">
<target name="compile" description="Compile source">
<mkdir dir="bin" />
<javac srcdir="src" includes="**" destdir="bin"/>
<copy todir="bin">
<fileset dir="src" />
</copy>
</target>
<target name="jar" description="Package into JAR" depends="compile">
<jar destfile="project.jar" basedir="bin" compress="true" />
</target>
</project>
最终把project.jar导入,程序编译通过。
最终生成的apk是横屏的,下面参考stackoverflow上的方法修改成竖屏http://stackoverflow.com/questions/10216943/android-zxing-change-orientation-to-portrait
1、CameraConfigurationManager.java 的 setDesiredCameraParameters 方法,修改摄像头的方向,插入下面代码:
camera.setDisplayOrientation(90);
2、DecodeHandler.java 的 decode 方法,将取到的目标图片(横屏方向)转换为竖屏方向后再进行解码,插入代码如下:
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
}
int tmp = width;
width = height;
height = tmp;
data = rotatedData;
3、CameraManager.java 的 getFramingRectInPreview 方法,将原有的 frame 的计算方法 替换如下:
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
4、如果以上三步依然不行的话,那么在 CameraConfigurationManager.java 的 initFromCameraParameters 方法中,把一下代码注释:
// if (width < height) {
// Log.i(TAG, "Display reports portrait orientation; assuming this is incorrect");
// int temp = width;
// width = height;
// height = temp;
// }