Ir para o console

Ler códigos de barras com o ML Kit no Android

É possível usar o ML Kit para reconhecer e decodificar códigos de barras.

Antes de começar

  1. Configure um projeto do Firebase:
    1. Crie um projeto do Firebase no Firebase console, caso você ainda não tenha um. Se você já tiver um projeto do Google associado ao aplicativo para dispositivos móveis, clique em Importar projeto do Google. Do contrário, clique em Adicionar projeto.
    2. Clique em Adicionar o Firebase ao aplicativo para Android e siga as etapas de configuração. Se você estiver importando um projeto existente do Google, isso poderá acontecer automaticamente. Basta fazer o download do arquivo de configuração.
    3. Quando solicitado, digite o nome do pacote do app. É importante inserir o nome do pacote que o app está usando. Isso só poderá ser definido quando você adicionar um app ao projeto do Firebase.
    4. Ao final, você fará o download de um arquivo google-services.json. É possível fazer o download do arquivo de configuração novamente a qualquer momento.
    5. Caso ainda não tenha feito isso, copie o arquivo para a pasta do módulo do projeto, normalmente app/.
  2. Extraia o SDK recebido do contato EAP:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. Adicione o diretório no qual você incluiu o SDK e o plug-in google-services ao build.gradle do nível do projeto:
    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. Em seguida, inclua a dependência do ML Kit e adicione a linha apply plugin ao arquivo build.gradle do nível do projeto:

    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'
    

Configurar o detector de código de barras

Se souber quais formatos de código de barras espera ler, você poderá aumentar a velocidade do detector de código de barras configurando-o para detectar apenas esses formatos.

Por exemplo, para detectar apenas o código do Aztec e os códigos QR, crie um objeto FirebaseVisionBarcodeDetectorOptions como no seguinte exemplo:

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

Os seguintes formatos são compatíveis:

  • 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)
  • QR Code (FORMAT_QR_CODE)
  • PDF417 (FORMAT_PDF417)
  • Aztec (FORMAT_AZTEC)

Executar o detector de código de barras

Para reconhecer códigos de barras em uma imagem, passe a imagem como um objeto ByteBuffer ao método FirebaseVisionBarcodeDetector de detectInBuffer ou como um objeto android.graphics.Bitmap ao método detectInImage.

  1. Receba uma instância de FirebaseVisionBarcodeDetector:

    FirebaseVisionBarcodeDetector detector = FirebaseVision.getInstance()
        .getVisionBarcodeDetector(options);
    
  2. Crie um objeto FirebaseVisionImageMetadata que contenha os metadados da imagem.

    Se estiver passando a imagem como um ByteBuffer, você precisará especificar a altura, a largura, o formato de codificação da cor e a orientação da imagem:

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

    Se você estiver passando a imagem como um Bitmap, bastará especificar a orientação da imagem:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Por fim, passe a imagem ao método detectInBuffer ou 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
                // ...
              }
            });
    

Receber informações de códigos de barras

Se a operação de reconhecimento de código de barras for bem-sucedida, uma matriz de objetos FirebaseVisionBarcode será passada ao listener de êxito. Cada objeto FirebaseVisionBarcode representa um código de barras detectado na imagem. Para cada código de barras, é possível receber as coordenadas delimitadoras na imagem de entrada, bem como os dados brutos codificados no código de barras. Além disso, se o detector de código de barras tiver sido capaz de determinar o tipo de dados codificados pelo código de barras, será possível receber um objeto contendo dados analisados.

Por exemplo:

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