סורק מסמכים עם ML Kit ב-Android

אפשר להשתמש ב-ML Kit Document Scanner API כדי להוסיף בקלות תכונה של סורק מסמכים לאפליקציה.

תכונה פרטים
שם ה-SDK play-services-mlkit-document-scanner
הטמעה המודלים, הלוגיקה של הסריקה והזרימה של ממשק המשתמש מורדים באופן דינמי על ידי Google Play Services.
השפעה על גודל האפליקציה הגדלה של גודל ההורדה בכ-300KB.
זמן האתחול יכול להיות שהמשתמשים יצטרכו לחכות עד שהמודלים, הלוגיקה וזרימת ממשק המשתמש יורדו לפני השימוש הראשון.

רוצה לנסות?

כדי לראות דוגמה לשימוש ב-API הזה, אפשר להתנסות באפליקציה לדוגמה.

לפני שמתחילים

  1. בקובץ build.gradle ברמת הפרויקט, מוודאים שמאגר Maven של Google נכלל גם בקטע buildscript וגם בקטע allprojects.

  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. אחר כך אפשר להתחיל את פעילות הסורק באמצעות Activity Result APIs שהוצגו ב-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 או שניהם) שאתם באמת צריכים.