关于二维码,相信没有没听过的吧,但是很多人想自己生成下二维码,今天我就给大家分享下二维码的生成。
二维码的生成我们使用git上的开源项目zxing的jar包,毕竟二维码的生成原理很复杂,相信大部分人都不明白,所以这里我先给大家说说使用zxing来生成二维码,后面等我阅读完源码再和大家分享二维码的生成原理。
把该jar包放在libs目录下,然后我们就可以开始编码了
把生成的部分抽取取来,方便调用。这里用到zxing的方法有5个,首先在生成二维码的时候有可能会出错,所以需要抛出异常(WriterException);第二个EncodeHintType,用来设置编码格式,不然生成的有中文的二维码扫出来的结果是中文部分乱码;
private static final int BLACK = 0xff000000;// 黑色
private static final int WHITE = 0xffffffff;// 白色
/**
* 二维码生成
*
* @param str
* @param widthAndHeight
* @return
* @throws WriterException
*/
private Bitmap createQRCode(String str, int widthAndHeight)
throws WriterException {
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 使用utf8编码
BitMatrix matrix = new MultiFormatWriter().encode(str,
BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight, hints);// 这里需要把hints传进去,否则会出现中文乱码
int width = matrix.getWidth();
int height = matrix.getHeight();
int[] pixels = new int[width * height];
// 上色,如果不做保存二维码、分享二维码等功能,上白色部分可以不写。至于原因,在生成图片的时候,如果没有指定颜色,其会使用系统默认颜色来上色,很多情况就会出现保存的二维码图片全黑
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (matrix.get(x, y)) {// 有数据的像素点使用黑色
pixels[y * width + x] = BLACK;
} else {// 其他部分则使用白色
pixels[y * width + x] = WHITE;
}
}
}
//生成bitmap
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
然后再需要的地方调用就可以了生成了
try {
qrCodeBitmap = createQRCode("这是二维码测试", 450);
mQcImage.setImageBitmap(qrCodeBitmap);// set到imageview上显示出来
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
调用时抛出异常,调用createQRCode方法时传递两个参数,第一个二维码内容,第二个生成二维码的尺寸。
好了,都可以生成了把?
好,下面我说说二维码常见的数据类型。
二维码的数据类型大致上有9种:网址、邮箱、电话号码、普通信息、彩信、名片、地理位置、软件、无线WIFI。
1.网址:
估计很多人都知道,二维码可以直接识别http://blog.youkuaiyun.com/hjhrq1991这串网址,不过标准的格式是{URLTO:blog.youkuaiyun.com/hjhrq1991},
2.邮箱:
邮箱的文法是这样的:{mailto:hjhrq1991@163.com}
3.电话号码:
电话号码的文法:{tel:13713713712}
4.普通信息:
普通信息的文法:{smsto:13800138000:您好,我是demo}
5.彩信:
彩信的文法和普通信息的文法一样,唯一不同就是标识前缀不同,普通信息为smsto,而彩信为mmsto
该文法为{mmsto:13800138000:您好,我是demo}
6.名片:
名片格式有多种,我就不一一介绍,这里我只要介绍下Vcard名片:
Vcard标准格式为:
BEGIN:VCARD VERSION:1.0 FN:能弄好 TEL;CELL;VOICE:1380013800 TEL;WORK;VOICE:010-62100000 TEL;WORK;FAX:010-62100001 EMAIL;PREF;INTERNET:lzw#lzw.me URL:http://lzw.me orG:志文工作室 ROLE:产品部 TITLE:CTO ADR;WORK;POSTAL:xx市xx路xxx;100101 REV:date END:VCARD
7.地理位置:
地理位置二维码需要3个参数,第一个为北纬,第二个西经,第三个为海拔;
前缀为geo,因此该文法为{geo:40xxx,-75,200}
8.软件:
软件其实就是到市场上下载,所以前缀为market
{market://details?id=com.tencent.mm}
9.无线WIFI:
无线wifi根据密码情况可分为3种:1)无密码;2)WEP加密;3)WPA/WPA2加密
因此我先说下wifi各部分的情况,标识前缀为WIFI,wifi名为S,密码为P,加密方式为T;
标准文法为:
无密码:{WIFI:S:wifi-8899;P:12345678;T:NOPASS;}或者{WIFI:S:wifi-8899;T:NOPASS;}也可以{WIFI:S:wifi-8899;}
WEP:{WIFI:S:wifi-8899;P:12345678;T:WEP;}
WPA/WPA2:{WIFI:S:wifi-8899;P:12345678;T:WPA;}
使用以上文法来生成二维码均能生成wifi信息,如果wifi信息正确,则可以直接扫描结果连接到wifi上