本文详细 介绍 QR Code 二维码的应用
第一部分 通过网络, 前端产生QR Code 二维条形码
产生 QR Code 图像需要传递的参数如下:
名 称 | 带入参数值 |
cht | 告诉Google Chart 要呈现什么类型的图片文件,由于此范例是要呈现出QR Code,因此该参数填入qr |
chs | QR Code 图片文件的维度,如本示例使用 120 X120 |
ch1 | 欲编码的文字内容 |
choe | 编码方式,国内OMIA 联盟仅支持 UTF-8 |
示例代码 getGooelQRChart() 方法即是组成要显示的远程图像网址, 再以 <img src=""> 方式来组成 HTML TAG,成像的关键是利用 WebView 来显示 Html 里的内容
主要代码:
/* 调用Google API,产生QR Code二维条形码 */
public String genGoogleQRChart(String strToQRCode, int strWidth) {
String strReturn = "";
try {
strReturn = new String(strToQRCode.getBytes("utf-8"));
/* 组成Google API需要的传输参数字符串 */
strReturn = "<html><body>"
+ "<img src=http://chart.apis.google.com/chart?chs=" + strWidth + "x"
+ strWidth + "&chl=" + URLEncoder.encode(strReturn, "utf-8")
+ "&choe=UTF-8&cht=qr></body></html>";
} catch (Exception e) {
e.printStackTrace();
}
return strReturn;
}
其中strToQRCode 可输入字符,如 "中国"
示意图
注意有一个小技巧:
QR Code 二维条形码对汉字的编码是采用UTF-8, 程序中编写了一个自定义方法 big52unicode() 来转换,如果手机的编码为BIG5,
可以通过此方法来转换为UTF-8
/* 自定义BIG5转UTF-8 */
public String big52unicode(String strBIG5) {
String strReturn = "";
try {
strReturn = new String(strBIG5.getBytes("big5"), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return strReturn;
}
/* 自定义UTF-8转BIG5 */
public String unicode2big5(String strUTF8) {
String strReturn = "";
try {
strReturn = new String(strUTF8.getBytes("UTF-8"), "big5");
} catch (Exception e) {
e.printStackTrace();
}
return strReturn;
}
除了条形码,以下接着介绍一个Pie饼状图
名 称 | 参数值 |
cht | Pie Chart 有很多类型,3D Pie参数为p3 |
chs | 设置图片维度大小: 250X100 |
chl | 设置两个分类名称为: L,K |
chd | 设置各个分类的比例 |
运行本例子后, 是有示意图的。
具体用法请参见 EX09_03 工程
第二部分 断网情况下,手机本地生成 QR Code 二维条形码
要本地生成二维码,首先需要下载第三方jar 包, 首先打开 http://www.swetake.com/index-e.php 网站, 下载所提供的Java Library ,
这里使用 ver. 0.50 beta,导入SwetakeQRCode.jar,
程序流程是: 用户输入字符串,利用SwetakeQRCode.jar 包转成产生图片文件二维数组,作为产生条形码依据,在SurfaceView 上绘制二维条形码矩形图片。
主要代码如下:
/* 自定义产生QR Code的函数 */
public void AndroidQREncode(String strEncoding, int qrcodeVersion) {
try {
/* 建构QRCode编码对象 */
com.swetake.util.Qrcode testQrcode = new com.swetake.util.Qrcode();
/* L','M','Q','H' */
testQrcode.setQrcodeErrorCorrect('M');
/* "N","A" or other */
testQrcode.setQrcodeEncodeMode('B');
/* 0-20 */
testQrcode.setQrcodeVersion(qrcodeVersion);
// getBytes
byte[] bytesEncoding = strEncoding.getBytes("utf-8");
if (bytesEncoding.length>0 && bytesEncoding.length <120) {
/* 将字符串通过calQrcode函数转换成boolean数组 */
boolean[][] bEncoding = testQrcode.calQrcode(bytesEncoding);
/* 依据编码后的boolean数组,绘图 */
drawQRCode (bEncoding, getResources().getColor(R.drawable.black));
}
} catch (Exception e) {
e.printStackTrace();
}
}
其中程序默认的 QR Code Version 为4,经测试仅能接受62个字符,紧接着 调用drawQRCode() 方法接受来自编码后的 boolean 二维数组,将在SurfaceView 上绘制出QR Code 二维条形码
/* 在SurfaceView上绘制QR Code条形码 */
private void drawQRCode(boolean[][] bRect, int colorFill)
{
/* test Canvas*/
int intPadding = 20;
/* 欲在SurfaceView上绘图,需先lock锁定SurfaceHolder */
Canvas mCanvas01 = mSurfaceHolder01.lockCanvas();
/* 设置画布绘制颜色 */
mCanvas01.drawColor(getResources().getColor(R.drawable.white));
Paint mPaint01 = new Paint(); /* 创建画笔 */
mPaint01.setStyle(Paint.Style.FILL); /* 设置画笔颜色及模式 */
mPaint01.setColor(colorFill);
mPaint01.setStrokeWidth(1.0F);
/* 逐一加载2维boolean数组 */
for (int i=0;i<bRect.length;i++) {
for (int j=0;j<bRect.length;j++) {
if (bRect[j][i])
{
/* 依据数组值,绘出条形码方块
这里5个参数分别为 起点的x,y坐标,矩形的宽,高,方形外框的颜色 */
mCanvas01.drawRect(new Rect(intPadding+j*3+2, intPadding+i*3+2,
intPadding+j*3+2+3, intPadding+i*3+2+3), mPaint01);
}
}
}
/* 解锁SurfaceHolder,并绘图 */
mSurfaceHolder01.unlockCanvasAndPost(mCanvas01);
}
这里由于一次性绘图,不需要设置 mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);机制来持续更新SurfaceView
示意图如下:
具体代码请参见 EX10_04 工程
第三部分 手机拍照二维条形码,实现解码
本实例由于应用到拍照,必须在真机上才能实现功能.
前面两示例是先输入字符,获取二维码; 本示例相反,通过拍照扫描二维码,解码内容.
要对二维码进行解码,需引入第三方 jar 包
首先打开 http://sourceforge.jp/projects/qrcode/, 下载jar包,并将文件名修改为sourceForgeQRCode.jar,导入到项目中.
实现解码流程包括:
1. 打开相机, 运行预览 (Preview)
2. 设计瞄准框,让用户对准二维条形码
3. 拍照,取得静态图片
4. 将图片传递到 SourceForgeQRCode 的方法运行解码
具体代码请参见 EX10_05 工程