如何为Android应用程序生成QR码?

时间:2012-01-10 09:23:42

标签: java android qr-code

我需要在我的Android应用程序中创建一个qrcode,我需要一个库或源代码,让我在Android应用程序中创建一个QR码。

我需要的图书馆必须:

  1. 不留水印(如onbarcode库)
  2. 不使用网络服务API创建qrcode(如Google的图书馆zxing)
  3. 不需要第三方安装程序(如QR Droid)
  4. 我已经为iPhone(Objective-C)创建了这样的代码,但是我需要快速修复Android,直到我有时间制作自己的QR代码生成器。这是我的第一个Android项目,所以任何帮助都将受到赞赏。

6 个答案:

答案 0 :(得分:75)

使用zxing这是我创建QR的代码

 QRCodeWriter writer = new QRCodeWriter();
    try {
        BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, 512, 512);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE);
            }
        }
        ((ImageView) findViewById(R.id.img_result_qr)).setImageBitmap(bmp);

    } catch (WriterException e) {
        e.printStackTrace();
    }

答案 1 :(得分:57)

你有没有看过ZXING? 我已成功使用它来创建条形码。 您可以在bitcoin application src

中查看完整的工作示例
// this is a small sample use of the QRCodeEncoder class from zxing
try {
    // generate a 150x150 QR code
    Bitmap bm = encodeAsBitmap(barcode_content, BarcodeFormat.QR_CODE, 150, 150);

    if(bm != null) {
        image_view.setImageBitmap(bm);
    }
} catch (WriterException e) { //eek }

答案 2 :(得分:26)

也许这个老话题,但我发现这个库非常有用且易于使用

QRGen

在android中使用它的例子

 Bitmap myBitmap = QRCode.from("www.example.org").bitmap();
ImageView myImage = (ImageView) findViewById(R.id.imageView);
myImage.setImageBitmap(myBitmap);

答案 3 :(得分:13)

这是我生成Bitmap的简单而有效的功能! 我只使用ZXing1.3.jar! 我还将校正级别设置为高!

PS:x和y相反,它是正常的,因为bitMatrix反转x和y。此代码与方形图像完美配合。

public static Bitmap generateQrCode(String myCodeText) throws WriterException {
    Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
    hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // H = 30% damage

    QRCodeWriter qrCodeWriter = new QRCodeWriter();

    int size = 256;

    ByteMatrix bitMatrix = qrCodeWriter.encode(myCodeText,BarcodeFormat.QR_CODE, size, size, hintMap);
    int width = bitMatrix.width();
    Bitmap bmp = Bitmap.createBitmap(width, width, Bitmap.Config.RGB_565);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < width; y++) {
            bmp.setPixel(y, x, bitMatrix.get(x, y)==0 ? Color.BLACK : Color.WHITE);
        }
    }
    return bmp;
}

修改

使用像素int数组而不是bitmap.setPixel逐位使用bitmap.setPixels(...)会更快:

        BitMatrix bitMatrix = writer.encode(inputValue, BarcodeFormat.QR_CODE, size, size);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = bitMatrix.get(x, y) ? BLACK : WHITE;
            }
        }

        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

答案 4 :(得分:10)

我使用了zxing-1.3 jar,我不得不做一些改变来实现其他答案的代码,所以我会留给别人解决方案。我做了以下事情:

1)找到zxing-1.3.jar,下载并添加属性(添加外部jar)。

2)在我的活动布局中添加ImageView并命名它(在我的例子中它是tnsd_iv_qr)。

3)在我的活动中包含用于创建qr图像的代码(在此示例中,我为比特币支付创建了QR):

    QRCodeWriter writer = new QRCodeWriter();
    ImageView tnsd_iv_qr = (ImageView)findViewById(R.id.tnsd_iv_qr);
    try {
        ByteMatrix bitMatrix = writer.encode("bitcoin:"+btc_acc_adress+"?amount="+amountBTC, BarcodeFormat.QR_CODE, 512, 512);
        int width = 512;
        int height = 512;
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                if (bitMatrix.get(x, y)==0)
                    bmp.setPixel(x, y, Color.BLACK);
                else
                    bmp.setPixel(x, y, Color.WHITE);
            }
        }
        tnsd_iv_qr.setImageBitmap(bmp);
    } catch (WriterException e) {
        //Log.e("QR ERROR", ""+e);

    }

如果有人想知道,变量“btc_acc_adress”是一个字符串(带有BTC地址),则amountBTC是双倍的,当然还有交易金额。

答案 5 :(得分:5)

zxing不(仅)提供Web API;真的,那就是Google提供API,来自后来在项目中开源的源代码。

正如Rob在这里所说,您可以使用Java source code for the QR code encoder创建原始条形码,然后将其渲染为位图。

我还可以提供一种更简单的方式。您可以通过Intent调用Barcode Scanner来编码条形码。在android-integration下,您只需要几行代码和项目中的两个类。主要是IntentIntegrator。只需致电shareText()