web-dev-qa-db-fra.com

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

Je dois créer un qrcode dans mon Android application) et une bibliothèque ou un code source qui me permet de créer un code QR dans une Android app.

La bibliothèque dont j'ai besoin doit:

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

J'ai déjà créé ce code pour iPhone (Objective-C) mais il me faut une solution rapide pour Android jusqu'à ce que j'ai le temps de créer mon propre générateur de code QR. C'est mon premier Android projet, toute aide sera donc appréciée.

71
Radu

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

// 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 }
60
Rob

avec zxing c'est mon code pour créer 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();
    }
81
Stefano

Peut-être que cet ancien sujet, mais j’ai trouvé cette bibliothèque très utile et facile à utiliser

QRGen

exemple d'utilisation dans Android

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

Voici ma fonction simple et fonctionnelle pour générer un bitmap! J'utilise ZXing1.3.jar seulement! J'ai également réglé le niveau de correction sur Élevé!

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

EDIT

Il est plus rapide d'utiliser bitmap.setPixels (...) avec un tableau en pixels 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);
14
bluestart83

J'ai utilisé zxing-1.3 jar et j'ai dû faire quelques changements pour implémenter le code à partir d'autres réponses, je vais donc laisser ma solution à d'autres. J'ai fait ce qui suit:

1) trouvez zxing-1.3.jar, téléchargez-le et ajoutez-y des propriétés (ajoutez un fichier jar externe).

2) dans ma présentation d'activité, ajoutez ImageView et nommez-la (dans mon exemple, il s'agissait de tnsd_iv_qr).

3) inclure du code dans mon activité pour créer une image qr (dans cet exemple, je créais un code QR pour les paiements en bitcoins):

    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 pose la question, la variable "btc_acc_adress" est une chaîne (avec l'adresse BTC), montantBTC est un double, avec bien sûr le montant de la transaction.

10
Adam Staszak

zxing ne fournit pas (uniquement) une API Web; Vraiment, c’est Google qui fournit l’API, à partir du code source qui a ensuite été open source dans le projet.

Comme Rob le dit ici, vous pouvez utiliser le code source Java pour le codeur de code QR pour créer un code-barres brut, puis le restituer sous forme de bitmap.

Je peux encore offrir un moyen plus facile. Vous pouvez appeler Scanner de code à barres par intention pour coder un code à barres. Vous n'avez besoin que de quelques lignes de code et de deux classes du projet, sous Android-integration. Le principal est IntentIntegrator . Il suffit d'appeler shareText().

5
Sean Owen