在Android生成QR Code 二维条形码 ----- Google Chart API

本文详细 介绍 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  工程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值