ML Kit を使用した Android のドキュメント スキャナ

ML Kit Document Scanner API を使用すると、ドキュメント スキャナ機能をアプリに簡単に追加できます。

機能 詳細
SDK 名 play-services-mlkit-document-scanner
実装 モデル、スキャン ロジック、UI フローは、Google Play 開発者サービスによって動的にダウンロードされます。
アプリのサイズへの影響 ダウンロード サイズが約 300 KB 増加します。
初期化時間 モデル、ロジック、UI フローが完成するまで、 ダウンロードする必要があります。

試してみる

さまざまなデバイスで サンプルアプリ この API の使用例をご覧ください。

始める前に

  1. プロジェクト レベルの build.gradle ファイルの buildscript セクションと allprojects セクションの両方に Google の Maven リポジトリを組み込みます。

  2. ML Kit ドキュメント スキャナ ライブラリの依存関係をモジュールのアプリレベルの Gradle ファイル(通常は app/build.gradle)に追加します。

dependencies {
   // …
   implementation 'com.google.android.gms:play-services-mlkit-document-scanner:16.0.0-beta1'
}

ドキュメント スキャナの構成

ドキュメント スキャナのユーザーフロー(専用のビューファインダー画面を含む) とプレビュー画面など)が用意されています。ビューファインダーとプレビュー画面は、次のカスタマイズ可能なコントロールに対応しています。

  • フォト ギャラリーからインポートする
  • スキャンするページ数の上限を設定
  • スキャナモード(フローの機能セットを制御)

スキャンしたドキュメントの PDF ファイルと JPEG ファイルの両方を取得できます。

GmsDocumentScannerOptions をインスタンス化して、スキャナ オプションを構成します。

Kotlin

val options = GmsDocumentScannerOptions.Builder()
    .setGalleryImportAllowed(false)
    .setPageLimit(2)
    .setResultFormats(RESULT_FORMAT_JPEG, RESULT_FORMAT_PDF)
    .setScannerMode(SCANNER_MODE_FULL)
    .build()

Java

GmsDocumentScannerOptions options = new GmsDocumentScannerOptions.Builder()
    .setGalleryImportAllowed(false)
    .setPageLimit(2)
    .setResultFormats(RESULT_FORMAT_JPEG, RESULT_FORMAT_PDF)
    .setScannerMode(SCANNER_MODE_FULL)
    .build();

ドキュメントのスキャン

GmsDocumentScannerOptions を作成すると、 GmsDocumentScanner のインスタンス。次に、スキャナ アクティビティを開始します。 フォロー中 Activity Result API AndroidX で導入されました。

ドキュメントのスキャンが完了すると、GmsDocumentScanningResult オブジェクトによって、スキャンされたページ数、つまりドキュメントの URI へのアクセス権が付与されます。 で定義したものに従って、JPEG 形式と PDF setResultFormats:

Kotlin

val scanner = GmsDocumentScanning.getClient(options)
val scannerLauncher = registerForActivityResult(StartIntentSenderForResult()) {
  result -> {
    if (result.resultCode == RESULT_OK) {
      val result =
        GmsDocumentScanningResult.fromActivityResultIntent(result.data)
      result.getPages()?.let { pages ->
        for (page in pages) {
          val imageUri = pages.get(0).getImageUri()
        }
      }
      result.getPdf()?.let { pdf ->
        val pdfUri = pdf.getUri()
        val pageCount = pdf.getPageCount()
      }
    }
  }
}

scanner.getStartScanIntent(activity)
  .addOnSuccessListener { intentSender ->
     scannerLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
   }
  .addOnFailureListener {
    ...
  }

Java

GmsDocumentScanner scanner = GmsDocumentScanning.getClient(options);
ActivityResultLauncher<IntentSenderRequest> scannerLauncher =
  registerForActivityResult(
    new StartIntentSenderForResult(),
      result -> {
        if (result.getResultCode() == RESULT_OK) {
          GmsDocumentScanningResult result = GmsDocumentScanningResult.fromActivityResultIntent(result.getData());
          for (Page page : result.getPages()) {
            Uri imageUri = pages.get(0).getImageUri();
          }

          Pdf pdf = result.getPdf();
          Uri pdfUri = pdf.getUri();
          int pageCount = pdf.getPageCount();
        }
      });

scanner.getStartScanIntent(activity)
  .addOnSuccessListener(intentSender ->
    scannerLauncher.launch(new IntentSenderRequest.Builder(intentSender).build()))
  .addOnFailureListener(...);

パフォーマンスを向上させるためのヒント

ドキュメント ファイルの生成には時間と処理能力が必要となるため、実際に必要な出力形式(JPEG、PDF、またはその両方)のみをリクエストしてください。