Escáner de documentos con ML Kit en Android

Usa la API de escáner de documentos del Kit de AA para agregar fácilmente una función de escáner de documentos a tu app.

Característica Detalles
Nombre del SDK play-services-mlkit-document-scanner
Implementación Los Servicios de Google Play descargan los modelos, la lógica de análisis y el flujo de la IU de forma dinámica.
Impacto del tamaño de la app Aumento del tamaño de descarga de ~300 KB
Hora de inicialización Es posible que los usuarios deban esperar a que se descarguen los modelos, la lógica y el flujo de la IU antes de usarlos por primera vez.

Probar

Prueba la app de ejemplo para ver un ejemplo de uso de esta API.

Antes de comenzar

  1. En el archivo build.gradle de nivel de proyecto, asegúrate de incluir el repositorio Maven de Google en las secciones buildscript y allprojects.

  2. Agrega la dependencia para la biblioteca de análisis de documentos del Kit de AA al archivo Gradle de nivel de app de tu módulo, que suele ser app/build.gradle:

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

Configuración del escáner de documentos

El SDK proporciona el flujo de usuarios del escáner de documentos (que incluye una pantalla de visor dedicado y una pantalla de vista previa). El visor y la pantalla de vista previa admiten los siguientes controles personalizables:

  • importando de la galería de fotos
  • estableciendo un límite para el número de páginas analizadas
  • modo de escáner (para controlar los conjuntos de atributos en el flujo)

Puedes recuperar archivos PDF y JPEG para los documentos escaneados.

Crea una instancia de GmsDocumentScannerOptions para configurar las opciones del análisis:

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();

Escanea documentos

Después de crear tu GmsDocumentScannerOptions, obtén una instancia de GmsDocumentScanner. Luego, puedes iniciar la actividad del análisis siguiendo las APIs de Activity Result que se introdujeron en AndroidX.

Cuando se complete el escaneo de documentos, un objeto GmsDocumentScanningResult dará acceso a la cantidad de páginas escaneadas, los URI de las imágenes en formato JPEG y PDF según lo que se definió a través de 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(...);

Sugerencias para mejorar el rendimiento

Ten en cuenta que generar archivos de documentos lleva tiempo y requiere potencia de procesamiento, por lo que solo solicita los formatos de salida (JPEG, PDF o ambos) que realmente necesites.