web-dev-qa-db-fra.com

Android Générer un code QR et un code à barres avec Zxing

Le code pour générer du code Qr en utilisant zxing est ---

Cela prend des données de chaîne et la imageview Cela fonctionne très bien

private void generateQRCode_general(String data, ImageView img)throws WriterException {
    com.google.zxing.Writer writer = new QRCodeWriter();
    String finaldata = Uri.encode(data, "utf-8");

    BitMatrix bm = writer.encode(finaldata, BarcodeFormat.QR_CODE,150, 150);
    Bitmap ImageBitmap = Bitmap.createBitmap(150, 150,Config.ARGB_8888);

    for (int i = 0; i < 150; i++) {//width
        for (int j = 0; j < 150; j++) {//height
            ImageBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK: Color.WHITE);
        }
    }

    if (ImageBitmap != null) {
        qrcode.setImageBitmap(ImageBitmap);
    } else {
        Toast.makeText(getApplicationContext(), getResources().getString(R.string.userInputError),
                Toast.LENGTH_SHORT).show(); 
    }
}

Maintenant ma question est, comment obtenir bar code en utilisant la même bibliothèque.i vu certains fichiers liés à bar codes mais je ne sais pas comment le faire. Depuis que je veux générer le bar code dans l'application et ne pas appeler web service. Depuis que je suis déjà en utilisant zxing, pas la peine d'inclure itext et bocaux barbecue

12
Ciff

Vous utilisez QRCodeWriter. Si vous voulez écrire un autre type de code, utilisez un autre Writer.

Cochez cette option MultiFormatWriter - il peut écrire n’importe quel type de barre ou trouver des rédacteurs spécifiques ici dans des sous-dossiers (cela provient de la bibliothèque zxing)

3
Gaskoin

J'ai testé la réponse acceptée pour générer un code à barres, mais la sortie est flou lorsqu'il est utilisé dans un grand ImageView. Pour obtenir une sortie de haute qualité, le largeur BitMatrix, Bitmap et ImageView final doivent être identiques. Cependant, utiliser la réponse acceptée ralentira la génération de codes à barres (2-3 secondes). Cela se produit parce que

Bitmap.setPixel()

est une opération lente, et la réponse acceptée fait un usage intensif de cette opération (2 imbriquées pour des boucles).

Pour résoudre ce problème, j'ai légèrement modifié l'algorithme de génération Bitmap (ne l'utiliser que pour la génération de codes à barres) afin d'utiliser Bitmap.setPixels (), qui est beaucoup plus rapide:

private Bitmap createBarcodeBitmap(String data, int width, int height) throws WriterException {
    MultiFormatWriter writer = new MultiFormatWriter();
    String finalData = Uri.encode(data);

    // Use 1 as the height of the matrix as this is a 1D Barcode.
    BitMatrix bm = writer.encode(finalData, BarcodeFormat.CODE_128, width, 1);
    int bmWidth = bm.getWidth();

    Bitmap imageBitmap = Bitmap.createBitmap(bmWidth, height, Config.ARGB_8888);

    for (int i = 0; i < bmWidth; i++) {
        // Paint columns of width 1
        int[] column = new int[height];
        Arrays.fill(column, bm.get(i, 0) ? Color.BLACK : Color.WHITE);
        imageBitmap.setPixels(column, 0, 1, i, 0, 1, height);
    }

    return imageBitmap;
}

Cette approche est très rapide même pour de très gros résultats et génère un bitmap de haute qualité.

7
Iván Martínez

Comme Gaskoin l'a dit ... MultiFormatWrite cela a fonctionné :) voici le code.

      com.google.zxing. MultiFormatWriter writer =new  MultiFormatWriter();


        String finaldata = Uri.encode(data, "utf-8");

        BitMatrix bm = writer.encode(finaldata, BarcodeFormat.CODE_128,150, 150);
        Bitmap ImageBitmap = Bitmap.createBitmap(180, 40,Config.ARGB_8888);

        for (int i = 0; i < 180; i++) {//width
            for (int j = 0; j < 40; j++) {//height
                ImageBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK: Color.WHITE);
            }
        }

        if (ImageBitmap != null) {
            qrcode.setImageBitmap(ImageBitmap);
        } else {
            Toast.makeText(getApplicationContext(), getResources().getString(R.string.userInputError),
                    Toast.LENGTH_SHORT).show(); 
        }
6
Ciff

Voilà, 

public static Bitmap createBarCode (String codeData, BarcodeFormat barcodeFormat, int codeHeight, int codeWidth) {

    try {
        Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel> ();
        hintMap.put (EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

        Writer codeWriter;
        if (barcodeFormat == BarcodeFormat.QR_CODE) {
            codeWriter = new QRCodeWriter ();
        } else if (barcodeFormat == BarcodeFormat.CODE_128) {
            codeWriter = new Code128Writer ();
        } else {
            throw new RuntimeException ("Format Not supported.");
        }

        BitMatrix byteMatrix = codeWriter.encode (
            codeData,
            barcodeFormat,
            codeWidth,
            codeHeight,
            hintMap
        );

        int width   = byteMatrix.getWidth ();
        int height  = byteMatrix.getHeight ();

        Bitmap imageBitmap = Bitmap.createBitmap (width, height, Config.ARGB_8888);

        for (int i = 0; i < width; i ++) {
            for (int j = 0; j < height; j ++) {
                imageBitmap.setPixel (i, j, byteMatrix.get (i, j) ? Color.BLACK: Color.WHITE);
            }
        }

        return imageBitmap;

    } catch (WriterException e) {
        e.printStackTrace ();
        return null;
    }
}

Bien sûr, vous pouvez supporter autant de BarcodeFormats que vous le souhaitez, il suffit de changer le constructeur ici: 

Writer codeWriter;
if (barcodeFormat == BarcodeFormat.QR_CODE) {
    codeWriter = new QRCodeWriter ();
} else if (barcodeFormat == BarcodeFormat.CODE_128) {
    codeWriter = new Code128Writer ();
} else {
    throw new RuntimeException ("Format Not supported.");
}
2
user1079425

essayez ce code

Context context = getActivity();
Intent intent = new Intent("com.google.zxing.client.Android.ENCODE");
intent.putExtra("ENCODE_TYPE", Text);
intent.putExtra("ENCODE_DATA", "12345678901");
intent.putExtra("ENCODE_FORMAT", "UPC_A");
startActivity(intent);

espérons que cela vous aide.

0
i.n.e.f