Android ZXing Obtener imagen de código de barras

Estoy usando la biblioteca Zxing para generar un código de barras en mi aplicación de Android

Intent intent = new Intent("com.google.zxing.client.android.ENCODE");

intent.putExtra("ENCODE_FORMAT", "UPC_A");
intent.putExtra("ENCODE_DATA", "55555555555");

startActivityForResult(intent,0);

¿Hay alguna forma de guardar la imagen generada en mi aplicación que llama a Zxing? Veo eso en mi onActivityResult Obtengo intención nula.

Gracias de antemano por tu ayuda

preguntado el 28 de julio de 12 a las 00:07

¿Has resuelto este problema? yo tengo el mismo -

Yo también tengo el mismo problema. Me gustaría extraer la imagen generada, probablemente de onActivityResult como dijiste... -

3 Respuestas

Tome el caché de vistas y guárdelo en un mapa de bits algo como esto

View myBarCodeView = view.getRootView()
//Else this might return null
myBarCodeView.setDrawingCacheEnabled(true)
//Save it in bitmap
Bitmap mBitmap = myBarCodeView.getDrawingCache()

O dibuje su propio código de barras o CÓDIGO QR

//Change the writers as per your need
private void generateQRCode(String data) {
    com.google.zxing.Writer writer = new QRCodeWriter();
    String finaldata =Uri.encode(data, "ISO-8859-1");
    try {
        BitMatrix bm = writer.encode(finaldata,BarcodeFormat.QR_CODE, 350, 350);
        mBitmap = Bitmap.createBitmap(350, 350, Config.ARGB_8888);
        for (int i = 0; i < 350; i++) {
            for (int j = 0; j < 350; j++) {
                mBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK: Color.WHITE);
            }
        }
    } catch (WriterException e) {
        e.printStackTrace();
    }
    if (mBitmap != null) {
        mImageView.setImageBitmap(mBitmap);
    }
}
public void generateBarCode(String data){
    com.google.zxing.Writer c9 = new Code128Writer();
    try {
        BitMatrix bm = c9.encode(data,BarcodeFormat.CODE_128,350, 350);
        mBitmap = Bitmap.createBitmap(350, 350, Config.ARGB_8888);

        for (int i = 0; i < 350; i++) {
            for (int j = 0; j < 350; j++) {

                mBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK : Color.WHITE);
            }
        }
    } catch (WriterException e) {
        e.printStackTrace();
    }
    if (mBitmap != null) {
        mImageView.setImageBitmap(mBitmap);
    }
}

Una vez que obtenga la imagen de mapa de bits, simplemente guárdela

//create a file to write bitmap data
    File f = new File(FilePath, FileName+".png");
    f.createNewFile();

    //Convert bitmap to byte array
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ImageBitmap.compress(CompressFormat.PNG, 0, bos);
    byte[] bytearray = bos.toByteArray();

    //Write bytes in file
    FileOutputStream fos = new FileOutputStream(f);
    fos.write(bytearray);
    fos.flush();
    fos.close();

También puede consultar un pequeña biblioteca de github que había creado para crear código de barras o código QR

GZxingEncoder   Encoder = GZxingEncoder.getInstance();
Encoder.initalize(this);
//To generate bar code use this
Bitmap bitmap = Encoder.generateBarCode_general("some text")

respondido 11 nov., 13:10

El primer fragmento no va a funcionar. No puede tomar una "captura de pantalla" de la vista de otra actividad. El resto no es una mala idea... simplemente incruste la codificación. - Sean Owen

@Girish Nair estoy escaneando el código de barras y el código qr, entonces, ¿cómo verifico si tengo que generar un código de barras o un código qr? suero

@ErumHannan: El código de barras y el código QR son algo así como 2 idiomas diferentes, por lo que lo que elija hablar es su elección. Entonces, ¿qué tal un cuadro de diálogo de alerta que le pregunte al usuario si desea generar un código de barras o un código QR? Girish Nair

No se devuelve en el Intent ahora mismo. No hay manera de conseguirlo. Podría sugerir un parche para devolverlo; probablemente sea un par de días de trabajo. O pruebe el enfoque de Girish, que consiste simplemente en incorporar la codificación directamente.

Respondido 20 Abr '13, 17:04

¡Okey! Gracias por su rápida respuesta :) Como dije, tengo que usar otra aplicación. Estoy tratando de crear algo en torno a las intenciones con fines de investigación, por lo que sugeriré un parche. ¿Puede decirme cómo/dónde sugerir un parche? - Karim

Claro, el EncoderActivity está aquí: código.google.com/p/zxing/source/browse/… Tendría que devolver alguna representación binaria comprimida en el Intent, que luego se procesa aquí: code.google.com/p/zxing/source/browse/trunk/android-integration/… Puedes hacer un parche contra SVN idealmente. - Sean Owen

Para almacenar la imagen escaneada en ZXing, debe anular un método drawResultPoints en Class CaptureActivity.

 String root = Environment.getExternalStorageDirectory().toString();
 File myDir = new File(root);    
 myDir.mkdirs();
 Random generator = new Random();
 int n = 10000;
 n = generator.nextInt(n);
 String fname = "Image-"+ n +".jpg";
 File file = new File (myDir, fname);
 if (file.exists ()) file.delete (); 
 try {
     FileOutputStream out = new FileOutputStream(file);
     barcode.compress(Bitmap.CompressFormat.JPEG, 90, out);
     out.flush();
     out.close();

 } catch (Exception e) {
   Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
 }

Esto guardará la imagen escaneada en el directorio raíz de la tarjeta SD, puede personalizarla para guardarla en cualquier carpeta en particular que necesite. La imagen que almacenará es la imagen escaneada que aparece como una imagen fantasma mientras escanea.

Respondido 04 Oct 13, 06:10

En realidad, esto es realmente útil. Sí, puedes robar el caché de dibujo. Pero este es un método más confiable para obtener el mapa de bits escaneado. - Eran Goldin

@Rakshi, ¿puedes explicar más? suero

@EranGoldin sí, este método funciona bien para guardar la imagen, pero ¿cómo obtendré el nombre de la imagen? dentro de onActivityResult - suero

@ErumHanan nombre? Está adquiriendo un mapa de bits, no tiene nombre. - Eran Goldin

Lo siento, pero ¿cómo funciona esto? estoy tratando de extender CaptureActivity en lugar de Activity, pero no puedo extender CaptureActivity. Usarlo en implementos no funciona tan bien. No puedo anular un drawResultPoints función. ¿Dónde puedo encontrar el CaptureActivity ¿clase? - Razgriz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.