Come generare un codice QR per un'applicazione Android? [chiuso]


92

Devo creare un codice QR nella mia applicazione Android e ho bisogno di una libreria o di un codice sorgente che mi consenta di creare un codice QR in un'app Android.

La libreria di cui ho bisogno deve:

  1. non lasciare una filigrana (come la onbarcodelibreria)
  2. non utilizzare l'API del servizio web per creare il qrcode (come la libreria zxing di Google)
  3. non necessita di installatori di terze parti (come QR Droid)

Ho già creato questo codice per iPhone (Objective-C) ma ho bisogno di una soluzione rapida per Android fino a quando non avrò il tempo di creare un generatore di codice QR tutto mio. È il mio primo progetto Android, quindi qualsiasi aiuto sarà apprezzato.


potresti usare zxing il suo open source
nandeesh

2
zxing non è un'API web, in realtà, vedi sotto
Sean Owen

1
Prova la mia semplice app di prova per generare bitmap QR qui: stackoverflow.com/a/30529519/165071
Alexander Farber,

Risposte:


68

Hai esaminato ZXING ? L'ho usato con successo per creare codici a barre. Puoi vedere un esempio funzionante completo nell'applicazione bitcoin 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 }

Ho biforcato l'open source bitcoin da GitHub e l'ho provato sui miei dispositivi Android 2.2, chiusura forzata dell'applicazione, qualcosa non va?
Roy Lee

Scusa se non guardo quell'app da oltre un anno. Come indicato di seguito da Sean, controlla la fonte per l'encoder zxing qui: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Rob

@Rob genererà il codice QR del numero definito dall'utente? solo numero o numero con laphabets
Erum

@Erum creerà un codice a barre per la maggior parte delle stringhe alfanumeriche fornite
Rob

Usa questo: implementazione "me.dm7.barcodescanner: zxing: 1.9.13"
M. Usman Khan

97

con zxing questo è il mio codice per creare 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();
    }

Ha funzionato per me. Facile aggiunta.
Roon13

Grazie. Lavora per me.
RoShan Shan

@Stefano Può generare n no. di codice QR univoco?
Ashish Tiwari

Ha funzionato come un incantesimo g88 !! +1 C'è qualche opzione in cui posso aggiungere un logo a questo?
Amit

1
per evitare perdite di memoria, non dimenticare di gestire la memoria bitmap creata da Bitmap.createBitmap.
gMale

43

Forse questo vecchio argomento, ma ho trovato questa libreria molto utile e facile da usare

QRGen

esempio per usarlo in Android

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

2
Questa è una soluzione facile e funzionante!
Zohab Ali

5
.bitmap () non trovato
Marcel Adel

Dovresti usare la dipendenza Android: implementation 'com.github.kenglxn.QRGen:android:[version]' e importare la classe QRCode in questo modo:import net.glxn.qrgen.android.QRCode
anro

2
Impossibile risolvere: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan

2
Nel tuo progetto build.gradle aggiungi maven {url " jitpack.io "} a allprojects.repositiories
tagy22

18

Ecco la mia funzione semplice e funzionante per generare una bitmap! Uso solo ZXing1.3.jar! Ho anche impostato il livello di correzione su Alto!

PS: xey sono invertiti, è normale, perché bitMatrix inverte x e y. Questo codice funziona perfettamente con un'immagine quadrata.

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

MODIFICARE

È più veloce usare bitmap.setPixels (...) con un array di pixel int invece di bitmap.setPixel uno per uno:

        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

Ho usato il jar zxing-1.3 e ho dovuto apportare alcune modifiche implementando il codice da altre risposte, quindi lascerò la mia soluzione per gli altri. Ho fatto quanto segue:

1) trova zxing-1.3.jar, scaricalo e aggiungi proprietà (aggiungi jar esterno).

2) nel mio layout di attività aggiungi ImageView e nominalo (nel mio esempio era tnsd_iv_qr).

3) includi il codice nella mia attività per creare un'immagine qr (in questo esempio stavo creando QR per pagamenti bitcoin):

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

    }

Se qualcuno si sta chiedendo, la variabile "btc_acc_adress" è una stringa (con indirizzo BTC), amountBTC è un doppio, con, ovviamente, l'importo della transazione.


Usa questo: implementazione "me.dm7.barcodescanner: zxing: 1.9.13"
M. Usman Khan

5

zxing non fornisce (solo) un'API web; in realtà, è Google che fornisce l'API, dal codice sorgente che è stato successivamente reso open source nel progetto.

Come dice Rob qui, puoi utilizzare il codice sorgente Java per il codificatore del codice QR per creare un codice a barre grezzo e quindi renderlo come bitmap.

Posso offrire ancora un modo più semplice. Puoi chiamare Barcode Scanner by Intent per codificare un codice a barre. Sono necessarie solo poche righe di codice e due classi dal progetto, sotto android-integration. Il principale è IntentIntegrator . Chiama e basta shareText().


serbato questo sembra utile, solo spero di bypassare qualsiasi API web, che potrebbe un po 'scomodo, in modalità offline per la mia app, ma questo è molto promettente, lo esaminerò
Radu

Non sono sicuro di essere stato chiaro, ma sto dicendo che le opzioni di zxing non coinvolgono alcuna API web
Sean Owen

No, utilizza alcune librerie unavaile su Android, come java.awt
siemanko

Ciao, scusa per il necro di questo thread, penso che sia meglio se ho fatto una domanda qui. Ho l'applicazione dello scanner di codici a barre di voi ragazzi (la sto usando per scansionare un codice QR) e se avessi questa risposta corretta, potrei semplicemente fare lo stesso, aprire lo scanner di codici a barre tramite intento con argomenti diversi e restituirebbe un Codice QR bitmap per la visualizzazione?
Razgriz

1
@nivwusquorum, no, il codificatore non utilizza java.awto non si connette al Web e puoi vederlo utilizzato nell'applicazione Scanner di codici a barre - su Android, senza una connessione Internet. @Razgriz no, non restituisce l'immagine, ma mostra l'immagine sullo schermo per te. L'utente può salvare l'immagine.
Sean Owen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.