先上图
今天在看书的时候,讲到了日本的QR码,可以联网利用google去解析并生成QR码,格式如下:
https://chart.googleapis.com/chart?cht=qr&chs=200×200&choe=tuf-8&chld=L|4&chl=test
感觉挺麻烦的,不过原理很简单的,就是去拼接一个url,然后利用HttpUrlConnection去联网。
然后百度了一下,发现老美的Zxing挺好哒。于是就简单的实现一下。
整体代码很简单,首先我们得有Zxing.jar这个包,然后导入到我们的工程中。
然后就是布局了,布局也很简单,线性布局下面,有一个TextView,一个EditText,一个Button以及一个ImageView。
下面来看逻辑代码
首先初始化控件
private EditText et_content;
private Button btn_pro;
private ImageView iv;
private String url;
private void init() {
et_content = (EditText) findViewById(R.id.et_content);
btn_pro = (Button) findViewById(R.id.btn_pro);
iv = (ImageView) findViewById(R.id.iv);
}
btn_pro.setOnClickListener(this);
@Override
public void onClick(View view) {
url = et_content.getText().toString().trim();
createQRImage(url);
}
protected void createQRImage(String url) {
try {
// 判断URL合法性
if (url == null || "".equals(url) || url.length() < 1) {
return;
}
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 图像数据转换,使用了矩阵转换
BitMatrix bitMatrix = new QRCodeWriter().encode(url,
BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
// 下面这里按照二维码的算法,逐个生成二维码的图片,
// 两个for循环是图片横列扫描的结果
for (int y = 0; y < QR_HEIGHT; y++) {
for (int x = 0; x < QR_WIDTH; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * QR_WIDTH + x] = 0xff000000;
} else {
pixels[y * QR_WIDTH + x] = 0xffffffff;
}
}
}
// 生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
// 显示到一个ImageView上面
iv.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
下面给出全部代码
package org.guya.produceqr;
import java.util.Hashtable;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
/**
*
* @author guya
*
* @date 2015-1-23
*
*/
public class MainActivity extends Activity implements OnClickListener {
private EditText et_content;
private Button btn_pro;
private ImageView iv;
private String url;
private int QR_WIDTH = 200;
private int QR_HEIGHT = 200;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
btn_pro.setOnClickListener(this);
}
private void init() {
et_content = (EditText) findViewById(R.id.et_content);
btn_pro = (Button) findViewById(R.id.btn_pro);
iv = (ImageView) findViewById(R.id.iv);
}
@Override
public void onClick(View view) {
url = et_content.getText().toString().trim();
createQRImage(url);
}
protected void createQRImage(String url) {
try {
// 判断URL合法性
if (url == null || "".equals(url) || url.length() < 1) {
return;
}
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 图像数据转换,使用了矩阵转换
BitMatrix bitMatrix = new QRCodeWriter().encode(url,
BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
// 下面这里按照二维码的算法,逐个生成二维码的图片,
// 两个for循环是图片横列扫描的结果
for (int y = 0; y < QR_HEIGHT; y++) {
for (int x = 0; x < QR_WIDTH; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * QR_WIDTH + x] = 0xff000000;
} else {
pixels[y * QR_WIDTH + x] = 0xffffffff;
}
}
}
// 生成二维码图片的格式,使用ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
// 显示到一个ImageView上面
iv.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
}