lizongbo at 618119.com 工作,生活,Android,前端,Linode,Ubuntu,nginx,java,apache,tomcat,Resin,mina,Hessian,XMPP,RPC

2010年11月23日

使用zxing生成QRCode二维码,在Android的webview中调用条形码扫描

Filed under: Android,JavaScript,前端开发 — 标签:, , , , — lizongbo @ 21:41

使用zxing生成QRCode二维码,在Android的webview中调用条形码扫描
zxing是一个条形码和二维码生成及识别的java开源组件,QRcode的中文名字是:QR快速响应矩阵码。
1.下载zxing最新的包
到zxing的主页: http://code.google.com/p/zxing/
下载 http://zxing.googlecode.com/files/ZXing-1.6.zip
http://zxing.googlecode.com/files/BarcodeScanner3.52.apk
来源:http://code.google.com/p/zxing/downloads/list
其中BarcodeScanner3.5.2.apk是安装在Android操作系统的手机上的条码扫描器安装包。
条码扫描器的j2me版本下载地址为:
http://zxing.org/w/BarcodeReader.jad
http://zxing.org/w/BarcodeReader.jar

解压为:
D:\Java\-1.6

在dos窗口下进入到:D:\Java\zxing-1.6\core,然后运行ant命令进行编译
(必须先安装配置了ant。
ant最新版的下载地址为:http://ant.apache.org/bindownload.cgi
下载解压后在系统的环境变量中配置ANT_HOME:例如:ANT_HOME=D:\Java\apache-ant-1.7.0;
Path中必须有ant的bin目录,例如:
Path=D:\Java\jdk1.6.0_21\bin;D:\Java\apache-maven-2.0.9\bin;D:\Perl\site\bin;D:\
Perl\bin;D:\Java\apache-ant-1.7.0\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\
System32\Wbem;D:\Programs\svn-win32-1.5.4\bin;C:\Program Files\TortoiseSVN\bin;C
:\Program Files\QuickTime\QTSystem\
)
编译结果如下:
D:\Java\zxing-1.6\core>ant
Buildfile: build.xml

clean:

build:

init:

compile:
[mkdir] Created dir: D:\Java\zxing-1.6\core\build
[javac] Compiling 171 source files to D:\Java\zxing-1.6\core\build
[jar] Building jar: D:\Java\zxing-1.6\core\core.jar

BUILD SUCCESSFUL
Total time: 6 seconds

编译之后得到core.jar这个包。
再进入D:\Java\zxing-1.6\javase目录使用ant进行编译,编译结果如下:
D:\Java\zxing-1.6\javase>ant
Buildfile: build.xml

init:

build:
[mkdir] Created dir: D:\Java\zxing-1.6\javase\build
[javac] Compiling 6 source files to D:\Java\zxing-1.6\javase\build
[jar] Building jar: D:\Java\zxing-1.6\javase\javase.jar

BUILD SUCCESSFUL
Total time: 1 second
编译之后得到javase.jar这个包。

在Eclipse里新建Java工程:

编写java代码如下:
package com.lizongbo.;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;

import javax.imageio.ImageIO;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

public class QRCodeGen {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;

/**
* @param args
* @throws WriterException
* @throws IOException
*/
public static void main(String[] args) throws WriterException, IOException {
String picFormat = “png”;
StringBuilder sb = new StringBuilder(1024);
java.io.InputStreamReader fr = new InputStreamReader(
new FileInputStream(“d:\\quickli.vcf”), “GBK”);
BufferedReader br = new BufferedReader(fr);
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line).append(“\r\n”);
}
String str = sb.toString();// 二维码内容
System.out.println(str.length() + “|str==” + str);
str = new String(str.getBytes(“GBK”), “ISO-8859-1”);
String path = “d:/lzb”;
Hashtable hints = new Hashtable();
// hints.put(EncodeHintType.CHARACTER_SET, “GBK”);
BitMatrix bitMatrix = new MultiFormatWriter().encode(str,
BarcodeFormat.QR_CODE, 400, 400, hints);
/**
* begin 这段代码等同于就是 MatrixToImageWriter.writeToFile(bitMatrix, picFormat,
* file);
* 直接这样写就不用引用javase.jar
*/
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE); } } File file = new File(path + "." + picFormat); ImageIO.write(image, picFormat, file); /** * end 这段代码等同于就是 MatrixToImageWriter.writeToFile(bitMatrix, picFormat, * file); */ MatrixToImageWriter.writeToFile(bitMatrix, picFormat, file); } } 网址的QRcode生成如果不想编写代码,可以使用现成的google的api: http://chart.apis.google.com/chart?chs=150x150&cht=qr&chl=http://zxing.googlecode.com/files/BarcodeScanner3.5.2.apk&chld=L|1&choe=UTF-8 Vcard也可以生成QRcode: 参考:http://blog.yslifes.com/archives/686 在线对二维码进行解码的url: http://zxing.org/w/decode.jspx 在Webview中通过js也可以调用条形码扫描, 封装的java代码如下: final class BarCodeUtilHandler { public void tryGetBarCode() { Intent intent = new Intent("com.google.zxing.client..SCAN"); // intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, 0); } }; @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { Log.v(TAG, "onActivityResult===" + requestCode + "," + resultCode + "," + intent); if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents = intent.getStringExtra("SCAN_RESULT"); String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); webview.loadUrl("javascript:showBarCode(\'" + format + "|" + contents + "\')"); } else if (resultCode == RESULT_CANCELED) { webview.loadUrl("javascript:showBarCode(\'没有找到条码!\')"); } } } //webview.addJavascriptInterface(new BarCodeUtilHandler(), "barcodeutil"); //javascript调用:window.barcodeutil.tryGetBarCode(); //function showBarCode(str) { // try { // document.getElementById('data').value=str; // } catch (ee) { // } //}

3 Comments »

  1. 你好,想请教你哥问题,android里面怎么把网页上的几个参数通过一个事件发送到android的客户端,也就是java代码里面,在web里面很好实现,就是用一个表单提交,不知道android里面有没有,希望高手不吝赐教,谢谢
    我的QQ是464063715

    Reply

    lizongbo reply on 七月 16th, 2011:

    是webview的话,绑定js对象即可。

    评论 by 小西 — 2011年06月5日 @ 15:58

  2. quick牛逼啊,哈哈
    看到你的很多好文章了~~

    Reply

    评论 by hansen — 2012年10月18日 @ 16:13

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress