コンソールへ移動

ML Kit を使用してバーコードを読み取る(Android)

ML Kit を使用すると、バーコードの認識や検出ができます。

準備

  1. Firebase プロジェクトを設定します。
    1. Firebase プロジェクトをまだ用意していない場合は、Firebase コンソールで Firebase プロジェクトを作成します。モバイルアプリに関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。それ以外の場合は、[プロジェクトを追加] をクリックします。
    2. [Android アプリに Firebase を追加] をクリックし、設定手順に沿って操作します。既存の 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. 次に、ML Kit の依存関係を含めて、アプリレベルの build.gradle ファイルに apply plugin 行を追加します。

    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();

次の形式がサポートされています。

  • コード 128(FORMAT_CODE_128
  • コード 39(FORMAT_CODE_39
  • コード 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 コード(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. 最後に、画像を detectInBuffer または 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
                // ...
              }
            });
    

バーコードから情報を取得する

バーコード認識オペレーションが成功すると、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;
  }
}