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
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)
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é.
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();
}
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.");
}
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.