Ir a la consola

Lee códigos de barras con el Kit de AA en Android

Puedes usar el Kit de AA para reconocer y códigos de barras y decodificarlos

Antes de comenzar

  1. Configura un proyecto de Firebase:
    1. Crea un proyecto en Firebase console si no lo hiciste antes. Si ya tienes un proyecto de Google asociado con tu app para dispositivos móviles, haz clic en Importar proyecto de Google. De lo contrario, haz clic en Agregar proyecto.
    2. Haz clic en Agrega Firebase a tu app para Android y sigue los pasos de la configuración. Si estás importando un proyecto de Google existente, es posible que esto suceda de forma automática y solo tengas que descargar el archivo de configuración.
    3. Ingresa el nombre del paquete de la app cuando se te solicite. Es importante que ingreses el nombre de paquete que tu app está usando. Esto solo se puede configurar cuando agregas una app a tu proyecto de Firebase.
    4. Para finalizar el proceso, descargarás un archivo google-services.json. Puedes volver a descargar el archivo de configuración en cualquier momento.
    5. Si aún no lo haces, copia esto en la carpeta del módulo de tu proyecto, que generalmente es app/.
  2. Extrae el SDK que recibiste de tu contacto de EAP:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. Agrega el directorio en el que extrajiste el SDK y el complemento de Servicios de Google al archivo build.gradle del nivel de tu proyecto:
    buildscript {
      // ...
      dependencies {
          // ...
          classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
      }
    }
    
    allprojects {
      repositories {
        // Add this
        maven {
          url "$SDK_DIR"
        }
        // This should already be here
        jcenter()
    
        ...
      }
    }
    
  4. Luego, incluye la dependencia para el Kit de AA y agrega la línea apply plugin al archivo build.gradle del nivel de tu app:

    dependencies {
      // ...
      compile 'com.google.firebase:firebase-core:12.8.0-SNAPSHOT'
      compile 'com.google.firebase:firebase-ml-vision:12.8.0-SNAPSHOT'
    }
    
    // ADD THIS AT THE BOTTOM OF THE FILE
    apply plugin: 'com.google.gms.google-services'
    

Configura el detector de códigos de barras

Si sabes qué formatos de códigos de barras leerás, puedes configurar el detector de códigos de barras para que solo detecte esos formatos a fin de aumentar su velocidad.

Por ejemplo, para detectar solo código Aztec y códigos QR, crea un objeto FirebaseVisionBarcodeDetectorOptions como el del ejemplo siguiente:

FirebaseVisionBarcodeDetectorOptions options =
    new FirebaseVisionBarcodeDetectorOptions.Builder()
        .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE,
                           FirebaseVisionBarcode.FORMAT_AZTEC)
        .build();

Se admiten los siguientes formatos:

  • Code 128 (FORMAT_CODE_128)
  • Code 39 (FORMAT_CODE_39)
  • Code 93 (FORMAT_CODE_93)
  • Codabar (FORMAT_CODABAR)
  • EAN-13 (FORMAT_EAN_13)
  • EAN-8 (FORMAT_EAN_8)
  • ITF (FORMAT_ITF)
  • UPC-A (FORMAT_UPC_A)
  • UPC-E (FORMAT_UPC_E)
  • Data Matrix (FORMAT_DATA_MATRIX)
  • Código QR (FORMAT_QR_CODE)
  • PDF417 (FORMAT_PDF417)
  • Aztec (FORMAT_AZTEC)

Ejecuta el detector códigos de barras

Para reconocer códigos de barras en una imagen, pasa la imagen como un objeto ByteBuffer al método FirebaseVisionBarcodeDetector de detectInBuffer o como un objeto android.graphics.Bitmap al método detectInImage.

  1. Obtén una instancia de FirebaseVisionBarcodeDetector:

    FirebaseVisionBarcodeDetector detector = FirebaseVision.getInstance()
        .getVisionBarcodeDetector(options);
    
  2. Crea un objeto FirebaseVisionImageMetadata que contenga los metadatos de la imagen.

    Si pasas la imagen como un ByteBuffer, debes especificar su altura, ancho, formato de codificación del color y orientación:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    Si pasas la imagen como un Bitmap, solo debes especificar su orientación:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Por último, pasa la imagen al método detectInBuffer o detectInImage:

    Task<SparseArray<FirebaseVisionBarcode>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionBarcode>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionBarcode> barcodes) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

Obtén información de códigos de barras

Si la operación de reconocimiento de códigos de barras se ejecuta correctamente, se pasará un arreglo de objetos FirebaseVisionBarcode al agente de escucha que detecta el resultado correcto. Cada objeto FirebaseVisionBarcode representa un código de barras que se detectó en la imagen. Para cada código de barras, puedes obtener las coordenadas de sus límites en la imagen de entrada, junto con los datos sin procesar codificados en el código de barras. Además, si el detector de códigos de barras pudo determinar el tipo de datos codificados en el código de barras, puedes obtener un objeto que contenga los datos analizados.

Por ejemplo:

for(int i = 0; i < barcodes.size(); i++) {
  FirebaseVisionBarcode barcode = barcodes.valueAt(i);

  Rect bounds = barcode.getBoundingBox();
  Point[] corners = barcode.getCornerPoints();

  String rawValue = barcode.getRawValue();

  int valueType = barcode.getValueType();
  // See API reference for complete list of supported types
  switch (valueType) {
    case FirebaseVisionBarcode.TYPE_WIFI:
      String ssid = barcode.getWifi().getSsid();
      String password = barcode.getWifi().getPassword();
      int type = barcode.getWifi().getEncryptionType();
      break;
    case FirebaseVisionBarcode.TYPE_URL:
      String title = barcode.getUrl().getTitle();
      String url = barcode.getUrl().getUrl();
      break;
  }
}