转到控制台

在 Android 上使用机器学习套件读取条形码

您可以使用机器学习套件识别条形码并对其进行解码。

准备工作

  1. 设置一个 Firebase 项目:
    1. 如果您还没有 Firebase 项目,请在 Firebase 控制台中创建一个。如果您已经有与自己的移动应用相关联的现有 Google 项目,请点击导入 Google 项目。如果没有,请点击添加项目
    2. 点击将 Firebase 添加到您的 Android 应用,然后按设置步骤操作。如果您是导入现有 Google 项目,系统可能会自动执行这些操作,您只需下载配置文件即可。
    3. 出现提示时,输入应用的软件包名称。请务必输入应用在使用的软件包名称;只有在将应用添加到 Firebase 项目时您才能进行此设置。
    4. 最后,您要下载一个 google-services.json 文件。您可以随时重新下载配置文件
    5. 如果尚未将此文件复制到项目的模块文件夹(通常是 app/),请执行此操作。
  2. 将您从自己的 EAP 联系人那里接收到的 SDK 解压缩:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. 将 SDK 和 Google 服务插件解压缩到的目录添加到您的项目级 build.gradle
    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. 然后,添加机器学习套件的依赖项,并将 apply plugin 行添加到您的应用级 build.gradle 文件:

    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'
    

配置条形码检测器

如果您知道自己要读取哪些条形码格式,可以将条形码检测器配置为仅检测这些格式,从而提高条形码检测器的速度。

例如,要仅检测 Aztec 码和 QR 码,请按照以下示例构建 FirebaseVisionBarcodeDetectorOptions 对象:

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

支持以下格式:

  • 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)

运行条形码检测器

要识别图片中的条形码,请将图片作为 ByteBuffer 对象传递给 FirebaseVisionBarcodeDetectordetectInBuffer 方法,或将图片作为 android.graphics.Bitmap 对象传递给 detectInImage 方法。

  1. 获取 FirebaseVisionBarcodeDetector 的一个实例:

    FirebaseVisionBarcodeDetector detector = FirebaseVision.getInstance()
        .getVisionBarcodeDetector(options);
    
  2. 创建一个包含图片元数据的 FirebaseVisionImageMetadata 对象。

    如果要将图片作为 ByteBuffer 传递,则必须指定图片的高度、宽度、颜色编码格式和显示方向:

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

    如果要将图片作为 Bitmap 传递,则只需指定图片的显示方向:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. 最后,将图片传递给 detectInBufferdetectInImage 方法:

    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
                // ...
              }
            });
    

从条形码中获取信息

如果条形码识别操作成功,则系统会向成功侦听器传递一组 FirebaseVisionBarcode 对象。每个 FirebaseVisionBarcode 对象代表一个在图片中检测到的条形码。对于每个条形码,您可以获取它在输入图片中的边界坐标以及由条形码编码的原始数据。此外,如果条形码检测器能够确定条形码编码的数据类型,您就可以获取包含已解析数据的对象。

例如:

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