今天上网找了找可以从图片解析二维码 ,而不是从摄像头,找了半天,终于找到了居然不全,所以自己查资料,写了一个 可以生产二维码,并且从图片和摄像头都可以解析的demo。
二维码其实很简单,我用的是Google的ZXing的源代码(在后面的附件里有)。
下面来看一下代码,注释我已经写的很明白了,就不解释了。
生成二维码图片
// 生成QR图
private void encodeQRCode() {
try {
// 读取输入的String
String text = qr_text.getText().toString();
Log.i(TAG, "生成的文本:" + text);
if (text == null || "".equals(text) || text.length() < 1) {
return;
}
// android二维码的编码与解码(图片解码与摄像头解码)
// 实例化二维码对象
QRCodeWriter writer = new QRCodeWriter();
// 用一个map保存编码类型
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
// 保持字符集为“utf-8”
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
/*
* 第一个参数:输入的文本
* 第二个参数:条形码样式-》二维码
* 第三个参数:宽度
* 第四个参数:高度
* 第五个参数:map保存编码类型
*/
BitMatrix bitMatrix = writer.encode(text, BarcodeFormat.QR_CODE,
QR_WIDTH, QR_HEIGHT, hints);
System.out.println("w:" + bitMatrix.getWidth() + "h:"
+ bitMatrix.getHeight());
// 将像素保存在数组里
int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
for (int y = 0; y < QR_HEIGHT; y++) {
for (int x = 0; x < QR_WIDTH; x++) {
if (bitMatrix.get(x, y)) {// 二维码黑点
pixels[y * QR_HEIGHT + x] = 0xff000000;
} else {// 二维码背景白色
pixels[y * QR_HEIGHT + x] = 0xffffffff;
}
}
}
// 生成位图
Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
Bitmap.Config.ARGB_8888);
/*
* 第一个参数:填充位图的像素数组
* 第二个参数:第一个颜色跳过几个像素读取
* 第三个参数:像素的幅度
* 第四个参数:起点x坐标
* 第五个参数:起点y坐标
* 第六个参数:宽
* 第七个参数:高
*/
bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
// 显示图片
qr_image.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
解析二维码图片:
// 解析QR图片
private void decodeQRCode() {
Map<DecodeHintType, String> hints = new HashMap<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
Bitmap bitmap = ((BitmapDrawable) qr_image.getDrawable()).getBitmap();
RGBLuminanceSource source = new RGBLuminanceSource(bitmap);
// 转成二进制图片
BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
// 实例化二维码解码对象
QRCodeReader reader = new QRCodeReader();
Result result;
try {
// 根据解码类型解码,返回解码结果
result = reader.decode(bitmap1, hints);
System.out.println("res:》》》》》》》:" + result.getText());
// 显示解码结果
qr_result.setText(result.getText());
} catch (NotFoundException e) {
e.printStackTrace();
} catch (ChecksumException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
}
用摄像头解析就更简单了,直接Intent到ZXing中的CaptureActivity类 就OK了。
但是这样扫描完的二维码,自己也用不了呀。不用着急在CaptureActivity类的530行,也就是
// 条码/二维码结果
private void showResult(Result rawResult, ResultHandler resultHandler, Bitmap barcode)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
CharSequence displayContents = resultHandler.getDisplayContents();
if (barcode == null) {
builder.setIcon(R.drawable.launcher_icon);
} else {
Drawable drawable = new BitmapDrawable(barcode);
builder.setIcon(drawable);
}
builder.setTitle("Result");
builder.setMessage(displayContents);
builder.setPositiveButton("OK",new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(CaptureActivity.this,CaptureActivity.class);
startActivity(intent);
}
});
builder.setNegativeButton(R.string.button_cancel, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
CaptureActivity.this.finish();
}
});
builder.show();
}
这个方法中把所有的扫描结果返回了。你可以根据自己的选择往下写逻辑就行了。
源码都在附件里,有兴趣的可以看一下。