Wie generiere ich einen QR-Code für eine Android-Anwendung? [geschlossen]

91

Ich muss einen QR-Code in meiner Android-Anwendung erstellen, und ich benötige eine Bibliothek oder einen Quellcode, mit dem ich einen QR-Code in einer Android-App erstellen kann.

Die Bibliothek, die ich brauche, muss:

  1. kein Wasserzeichen hinterlassen (wie onbarcodeBibliothek)
  2. Verwenden Sie keine Webdienst-API, um den qrcode zu erstellen (wie z. B. die Bibliothek zxing von Google).
  3. Benötigen Sie keine Installer von Drittanbietern (wie QR Droid)

Ich habe diesen Code bereits für das iPhone (Objective-C) erstellt, benötige jedoch eine schnelle Lösung für Android, bis ich Zeit habe, einen eigenen QR-Code-Generator zu erstellen. Es ist mein erstes Android-Projekt, daher wird jede Hilfe geschätzt.

Radu
quelle
Sie könnten zxing seine Open Source
Nandeesh
2
zxing ist eigentlich keine Web-API, siehe unten
Sean Owen
1
Probieren Sie meine einfache Test-App zum Generieren einer QR-Bitmap hier aus: stackoverflow.com/a/30529519/165071
Alexander Farber

Antworten:

66

Hast du dir ZXING angesehen ? Ich habe es erfolgreich verwendet, um Barcodes zu erstellen. Sie können ein voll funktionsfähiges Beispiel in der Bitcoin-Anwendung src sehen

// 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 }
rauben
quelle
Ich habe die Bitcoin Open Source von Github und Tryout auf meinen Android 2.2-Geräten gegabelt, Application Force geschlossen, stimmt etwas nicht?
Roy Lee
Entschuldigung, ich habe mir diese App seit über einem Jahr nicht mehr angesehen. Wie unten von Sean erwähnt, überprüfen Sie die Quelle für den zxing-Encoder hier: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Rob
@Rob wird es QR-Code der benutzerdefinierten Nummer generieren? nur Nummer oder Nummer mit Laphabets
Erum
@Erum es wird ein Barcode für die meisten von Ihnen bereitgestellten alphanumerischen Zeichenfolgen erstellt
Rob
Verwenden Sie dies: Implementierung 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
95

Mit zxing ist dies mein Code zum Erstellen von 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();
    }
Stefano
quelle
Hat für mich gearbeitet. Einfaches Add-On.
Roon13
Danke. Arbeite für mich.
RoShan Shan
@Stefano Kann es n nein erzeugen. von eindeutigem QR-Code?
Ashish Tiwari
Arbeitete wie ein Zauber g88 !! +1 Gibt es eine Option, mit der ich ein Logo hinzufügen kann?
Amit
1
Vergessen Sie nicht , den Bitmap-Speicher zu verwalten, der von erstellt wird , um Speicherverluste zu vermeiden Bitmap.createBitmap.
Männlich
43

Vielleicht dieses alte Thema, aber ich fand diese Bibliothek sehr hilfreich und einfach zu bedienen

QRGen

Beispiel für die Verwendung in Android

 Bitmap myBitmap = QRCode.from("www.example.org").bitmap();
ImageView myImage = (ImageView) findViewById(R.id.imageView);
myImage.setImageBitmap(myBitmap);
Antwan
quelle
2
Dies ist eine einfache und funktionierende Lösung!
Zohab Ali
5
.bitmap () wurde nicht gefunden
Marcel Adel
Sie sollten Android-Abhängigkeit verwenden: implementation 'com.github.kenglxn.QRGen:android:[version]' und QRCode-Klasse wie folgt importieren:import net.glxn.qrgen.android.QRCode
anro
2
Fehler beim Auflösen: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan
2
Fügen Sie in Ihrem Projekt build.gradle maven {url " jitpack.io "} zu allprojects.repositiories hinzu
tagy22
16

Hier ist meine einfache und funktionierende Funktion zum Generieren einer Bitmap! Ich benutze nur ZXing1.3.jar! Ich habe auch die Korrekturstufe auf Hoch gesetzt!

PS: x und y sind umgekehrt, es ist normal, weil bitMatrix x und y umkehrt. Dieser Code funktioniert perfekt mit einem quadratischen Bild.

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

BEARBEITEN

Es ist schneller, bitmap.setPixels (...) mit einem Pixel-Int-Array anstelle von bitmap.setPixel einzeln zu verwenden:

        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);
bluestart83
quelle
12

Ich habe zxing-1.3 jar verwendet und musste einige Änderungen an der Implementierung von Code aus anderen Antworten vornehmen, damit ich meine Lösung anderen überlassen kann. Ich habe folgendes gemacht:

1) Finden Sie zxing-1.3.jar, laden Sie es herunter und fügen Sie Eigenschaften hinzu (fügen Sie ein externes jar hinzu).

2) Fügen Sie in meinem Aktivitätslayout ImageView hinzu und benennen Sie es (in meinem Beispiel war es tnsd_iv_qr).

3) Fügen Sie Code in meine Aktivität ein, um ein qr-Bild zu erstellen (in diesem Beispiel habe ich QR für Bitcoin-Zahlungen erstellt):

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

    }

Wenn sich jemand wundert, ist die Variable "btc_acc_adress" ein String (mit BTC-Adresse), der Betrag BTC ist ein Doppel, natürlich mit dem Transaktionsbetrag.

Adam Staszak
quelle
Verwenden Sie dies: Implementierung 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
5

zxing bietet (nur) keine Web-API; Das ist Google, das die API aus dem Quellcode bereitstellt, der später im Projekt als Open-Source-Version bereitgestellt wurde.

Wie Rob hier sagt, können Sie den Java-Quellcode für den QR-Code-Encoder verwenden , um einen rohen Barcode zu erstellen und ihn dann als Bitmap zu rendern.

Ich kann noch einen einfacheren Weg anbieten. Sie können Barcode Scanner by Intent aufrufen, um einen Barcode zu codieren. Sie benötigen nur ein paar Codezeilen und zwei Klassen aus dem Projekt unter android-integration. Der wichtigste ist IntentIntegrator . Rufen Sie einfach an shareText().

Sean Owen
quelle
Panzer dies scheint nützlich zu sein, nur ich würde hoffen, alle Web-APIs zu umgehen, die im Offline-Modus für meine App etwas unangenehm sein könnten, aber das ist sehr vielversprechend, ich werde es mir ansehen
Radu
Nicht sicher , ob ich war klar , aber ich sage , dass die ZXing Optionen haben nicht beinhalten alle Web - APIs
Sean Owen
Nein, es verwendet einige Bibliotheken, die auf Android nicht verfügbar sind, wie java.awt
siemanko
Hallo, tut mir leid, diesen Thread zu nekrotisieren. Ich denke, es ist besser, wenn ich hier nur eine Frage stelle. Ich habe die Barcode-Scanner-Anwendung von euch (ich verwende sie zum Scannen eines QR-Codes) und wenn ich diese Antwort richtig verstanden hätte, könnte ich das Gleiche tun, den Barcode-Scanner absichtlich mit verschiedenen Argumenten öffnen und es würde a zurückgeben Bitmap QR Code zur Anzeige?
Razgriz
1
@nivwusquorum, nein, der Encoder verwendet java.awtoder stellt keine Verbindung zum Web her, und Sie können sehen, dass es in der Barcode-Scanner-Anwendung verwendet wird - auf Android ohne Internetverbindung. @Razgriz nein, es wird das Bild nicht zurückgegeben, sondern es wird für Sie auf dem Bildschirm angezeigt. Der Benutzer kann das Bild speichern.
Sean Owen