今天上网找了找可以从图片解析二维码 ,而不是从摄像头,找了半天,终于找到了居然不全,所以自己查资料,写了一个 可以生产二维码,并且从图片和摄像头都可以解析的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(); }
这个方法中把所有的扫描结果返回了。你可以根据自己的选择往下写逻辑就行了。
源码都在附件里,有兴趣的可以看一下。