如何为Android应用程序生成QR码?[关闭]


92

我需要在android应用程序中创建一个qrcode,并且需要一个库或源代码,以便我可以在Android应用程序中创建QR Code。

我需要的图书馆必须:

  1. 不留下水印(如onbarcode图书馆)
  2. 不使用网络服务API创建qrcode(例如Google的zxing库)
  3. 不需要第三方安装程序(例如QR Droid)

我已经为iPhone(Objective-C)创建了这样的代码,但我需要针对Android的快速修复,直到有时间自己制作一个QR代码生成器。这是我的第一个android项目,因此任何帮助将不胜感激。


您可以使用zxing的开放源代码
nandeesh 2012年

2
zxing实际上不是Web API,请参见下文
Sean Owen

1
在这里尝试使用我的简单测试应用程序生成QR位图:stackoverflow.com/a/30529519/165071
Alexander Farber 2015年

Answers:


67

你有看过ZXING吗?我一直在成功使用它来创建条形码。您可以在比特币应用程序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 }

我已经从github分叉了比特币开源并在我的android 2.2设备上进行了试用,应用程序强制关闭,有什么问题吗?
罗伊·李

抱歉,我有超过一年没有看过该应用了。如Sean下文所述,请在此处签出zxing编码器的源代码:code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…–
Rob

@Rob会生成用户定义号码的QR码吗?唯一的数字或带有laphabet的数字
Erum

@Erum它将为大多数任何字母数字串条形码您提供
罗布

使用此:实行'1.9.13 me.dm7.barcodescanner:斑马线'
M.乌斯曼·汗

97

使用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();
    }

为我工作。轻松添加。
Roon13年

谢谢。为我工作。
RoShan Shan

@Stefano它可以生成n个否。唯一的QR码?
Ashish Tiwari

像魅力g88一样工作!!+1是否可以在其中添加一些徽标?
阿米特(Amit)

1
为了避免内存泄漏,请不要忘记管理由创建的位图内存Bitmap.createBitmap
gMale

43

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

QRGen

在android中使用它的示例

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

2
这是简单且可行的解决方案!
Zohab Ali

5
找不到.bitmap()
Marcel Adel

您应该使用android依赖项: implementation 'com.github.kenglxn.QRGen:android:[version]' 并导入QRCode类,如下所示:import net.glxn.qrgen.android.QRCode
anro

2
无法解决:com.github.kenglxn.QRGen:android:2.6.0
M. Usman Khan

2
在您的项目build.gradle中,将maven {url“ jitpack.io ”}添加到a​​llprojects.repositiories
tagy22

18

这是生成位图的简单易用的功能!我仅使用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;
}

编辑

将bitmap.setPixels(...)与像素int数组一起使用比使用bitmap.setPixel一对一地更快:

        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);

12

我使用了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是一个双倍,当然还有交易金额。


使用此:实行'1.9.13 me.dm7.barcodescanner:斑马线'
M.乌斯曼·汗

5

zxing不(仅)提供Web API;实际上,是Google从后来在项目中开源的源代码提供了API。

如Rob所说,您可以使用QR码编码器Java源代码创建原始条形码,然后将其呈现为位图。

我仍然可以提供一种更简单的方法。您可以通过Intent调用Barcode Scanner来对条形码进行编码。您只需要几行代码,就可以在项目下找到两个类android-integration。主要的是IntentIntegrator。只是打电话shareText()


坦克这似乎很有用,只是我希望在应用程序的脱机模式下绕过任何Web API,这可能有点让人
困惑

不确定我是否清楚,但我要说的是zxing选项涉及任何Web API
Sean Owen

不,它使用了一些在android上不可用的库,例如java.awt
siemanko 2013年

您好,很抱歉取消此线程,如果我在这里问一个问题,我认为更好。我有你们的条形码扫描仪应用程序(我正在用它来扫描QR码),如果我正确地回答了这个问题,我也可以做同样的事情,通过使用不同参数的意图打开条形码扫描仪,它将返回一个显示的位图QR码?
Razgriz

1
@nivwusquorum,不,编码器未使用java.awt或未连接到网络,并且您可以在没有互联网连接的Android上的Barcode Scanner应用程序中看到该编码器。@Razgriz否,它不会返回图像,但会在屏幕上为您显示图像。用户可以保存图像。
肖恩·欧文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.