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

ML Kit のドキュメント スキャナ 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'
}

ドキュメント スキャナの設定

ドキュメント スキャナのユーザーフロー(専用のビューファインダー画面とプレビュー画面を含む)は SDK によって提供されます。ビューファインダーとプレビュー画面では、以下のカスタマイズ可能なコントロールを使用できます。

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

スキャンしたドキュメントは 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 のインスタンスを取得します。その後、AndroidX で導入された Activity Result API に従ってスキャナ アクティビティを開始できます。

ドキュメントのスキャンが完了すると、GmsDocumentScanningResult オブジェクトによって、スキャンされたページ数、JPEG 形式の画像の URI、setResultFormats で定義した内容に基づく PDF にアクセスできます。

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、またはその両方)のみをリクエストします。