Escáner de documentos con ML Kit en Android

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

Función Detalles
Nombre del SDK play-services-mlkit-document-scanner
Implementación Los modelos, la lógica de análisis y el flujo de la IU se descargan de forma dinámica Servicios de Google Play
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 tengan que esperar a que los modelos, la lógica y el flujo de la IU descargar antes del primer uso.

Probar

Diviértete con el app de ejemplo para ver un ejemplo de uso de esta API.

Antes de comenzar

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

  2. Agrega la dependencia para la biblioteca del escáner de documentos del Kit de AA a tu a nivel de la app del 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 flujo de usuario del escáner de documentos (que incluye una pantalla de visor dedicada) y la pantalla de vista previa) es el SDK. El visor y la pantalla de vista previa admiten los siguientes controles personalizables:

  • importando desde la galería de fotos
  • estableciendo un límite para la cantidad de páginas escaneadas
  • 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 escáner:

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 escáner siguiendo APIs de Activity Result que se introdujo en AndroidX.

Cuando finalice el escaneo del documento, un objeto GmsDocumentScanningResult permitirá el acceso al número de páginas analizadas, a los URI de la en formato JPEG y PDF de acuerdo con lo que se definió mediante 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 procesamiento energía, así que solo debes solicitar los formatos de salida (JPEG, PDF o ambos) en los que que necesitan tus usuarios.