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

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

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

ลองเลย

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

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

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

  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 จากนั้นคุณจะเริ่มกิจกรรมเครื่องมือสแกนได้ ตาม 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 อย่าง) ที่คุณต้องการเท่านั้น