104 votes

Comment générer un code QR pour une application Android?

Je dois créer un code QR dans mon application Android, et j'ai besoin d'une bibliothèque ou d'un code source qui me permette de créer un code QR dans une application Android.

La bibliothèque dont j'ai besoin doit :

  1. ne pas laisser de filigrane (comme la bibliothèque onbarcode)
  2. ne pas utiliser de service Web API pour créer le code QR (comme la bibliothèque de Google zxing)
  3. ne pas nécessiter d'installateurs tiers (comme QR Droid)

J'ai déjà créé un tel code pour iPhone (Objective-C) mais j'ai besoin d'une solution rapide pour Android en attendant d'avoir le temps de créer mon propre générateur de code QR. C'est mon premier projet Android donc toute aide sera appréciée.

111voto

Stefano Points 158

Avec zxing voici mon code pour créer un 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();
    }

80voto

Rob Points 2362

Avez-vous consulté ZXING? Je l'utilise avec succès pour créer des codes-barres. Vous pouvez voir un exemple de travail complet dans le code source de l'application bitcoin

// ceci est un petit exemple d'utilisation de la classe QRCodeEncoder de zxing
try {
    // générer un code QR de 150x150
    Bitmap bm = encodeAsBitmap(barcode_content, BarcodeFormat.QR_CODE, 150, 150);

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

52voto

Antwan Points 2370

Peut-être que ce sujet est vieux mais j'ai trouvé que cette bibliothèque est très utile et facile à utiliser

QRGen

exemple d'utilisation sur Android

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

22voto

bluestart83 Points 297

Voici ma fonction simple et fonctionnelle pour générer un Bitmap! J'utilise uniquement ZXing1.3.jar! J'ai également défini le Niveau de Correction sur High!

PS: x et y sont inversés, c'est normal, car bitMatrix inverse x et y. Ce code fonctionne parfaitement avec une image carrée.

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

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

EDIT

Il est plus rapide d'utiliser bitmap.setPixels(...) avec un tableau de pixels int au lieu de bitmap.setPixel un par un:

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

13voto

Adam Staszak Points 33

J'ai utilisé le jar zxing-1.3 et j'ai dû apporter quelques modifications en implémentant du code issu d'autres réponses, donc je vais laisser ma solution pour les autres. J'ai fait ce qui suit:

1) trouver zxing-1.3.jar, le télécharger et l'ajouter dans les propriétés (ajouter un jar externe).

2) dans la mise en page de mon activité, ajouter un ImageView et le nommer (dans mon exemple, c'était tnsd_iv_qr).

3) inclure du code dans mon activité pour créer une image QR (dans cet exemple, je créais un QR pour les paiements en 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);

    }

Si quelqu'un se demande, la variable "btc_acc_adress" est une chaîne de caractères (avec l'adresse BTC), amountBTC est un double, avec, bien sûr, le montant de la transaction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X