เครื่องสแกนเอกสารด้วย ML Kit ใน Android

ใช้ Document Scanner API ของ ML Kit เพื่อเพิ่มฟีเจอร์เครื่องสแกนเอกสารลงใน แอปของคุณได้อย่างง่ายดาย

ฟีเจอร์ รายละเอียด
ชื่อ SDK play-services-mlkit-document-scanner
การใช้งาน บริการ Google Play จะดาวน์โหลดโมเดล ตรรกะการสแกน และโฟลว์ UI แบบไดนามิก
ผลกระทบต่อขนาดแอป ขนาดการดาวน์โหลดเพิ่มขึ้นประมาณ 300 KB
เวลาเริ่มต้น ผู้ใช้อาจต้องรอให้ระบบดาวน์โหลดโมเดล ตรรกะ และโฟลว์ UI ก่อนจึงจะใช้งานได้เป็นครั้งแรก

ลองเลย

ลองใช้แอปตัวอย่าง เพื่อดูตัวอย่างการใช้งาน API นี้

ก่อนเริ่มต้น

  1. ในไฟล์ build.gradle ระดับโปรเจ็กต์ ให้ตรวจสอบว่าได้รวมที่เก็บ Maven ของ Google ไว้ทั้งในส่วน buildscript และ allprojects

  2. เพิ่มทรัพยากร Dependency สำหรับคลังเครื่องสแกนเอกสารของ 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 จากนั้นคุณจะเริ่มกิจกรรมสแกนเนอร์ได้ โดยทำตาม 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 หรือทั้ง 2 อย่าง) ที่คุณต้องการจริงๆ เท่านั้น