Saltar al contenido principal
MÓDULO NATIVO

OCR

Esta documentación provee una guía detallada para desarrolladores sobre cómo integrar e implementar el componente SDK OCR en aplicaciones Android utilizando Jetpack Compose. El SDK permite la captura y procesamiento eficiente y seguro de datos de documentos de identificación.
Regresar
ANDROIDJETPACK COMPOSEv2.2.0

Compatibilidad y Requisitos

Lenguaje
Kotlin / Java
OS Min
Android 7+
API / Target
API 24+
IDE
Jellyfish+

1. Configuración del Proyecto

Configura las dependencias del proyecto agregando la librería en tus archivos de Gradle y el catálogo de versiones.

libs.versions.toml

[versions]
dicioOcr = "2.2.0"

[libraries]
dicio-ocrsdk = { group = "io.bitbucket.juarezsdco", name = "ocrsdk", version.ref = "dicioOcr" }

build.gradle

dependencies {
implementation(libs.dicio.ocrsdk)
}

2. Uso Básico

El SDK se proporciona como un Composable de Jetpack Compose llamado DicioCamera. Debes invocar este Composable en el punto de tu UI donde desees mostrar la interfaz de escaneo.

OcrScreen.kt

package com.tuapp.yourapp

import ai.dicio.ocrsdk.core.OcrCallback
import ai.dicio.ocrsdk.ui.models.settings.OcrResult
import ai.dicio.ocrsdk.ui.screens.camera.DicioCamera
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import kotlin.time.Duration.Companion.seconds
import android.util.Log
import org.json.JSONException
import org.json.JSONObject

// ... (Tu lógica para obtener el token)
// Por ejemplo, usando State para manejar el token
sealed class TokenState {
object Loading : TokenState()
data class Success(val token: String) : TokenState()
data class Error(val message: String) : TokenState()
}

@Composable
fun OcrScreen(tokenState: TokenState, modifier: Modifier = Modifier) {
// ... (Mostrar pantalla de carga, error o SDK dependiendo del tokenState) ...

when(tokenState) {
TokenState.Loading -> { /* Mostrar indicador de carga */ }
is TokenState.Error -> { /* Mostrar mensaje de error */ }
is TokenState.Success -> {
// Cuando el token esté listo, mostrar la DicioCamera
DicioCameraIntegration(token = tokenState.token, modifier = modifier)
}
}
}

@Composable
fun DicioCameraIntegration(token: String, modifier: Modifier = Modifier) {
// Debes proveer tu applicationId y la URL base de tu API
val myApplicationId = "tu.application.id" // Reemplaza con tu Application ID real
val myUrlBase = "https://tu_url" // Reemplaza con tu URL base real

val ocrCallback = remember {
object : OcrCallback {
override fun onSuccess(result: OcrResult) {
// Escaneo exitoso. Procesa los datos recibidos.
Log.d("OCR_SDK", "¡Escaneo exitoso!")
Log.d("OCR_SDK", "Result Data: \${result.resultData}") // Datos extraídos en formato JSON
Log.d("OCR_SDK", "Face Image B64 (primeros 50 chars): \${result.faceImageBase64.take(50)}...")
Log.d("OCR_SDK", "Front Image B64 (primeros 50 chars): \${result.frontImageBase64.take(50)}...")
Log.d("OCR_SDK", "Back Image B64 (primeros 50 chars): \${result.backImageBase64.take(50)}...")

// Aquí puedes navegar para cerrar la pantalla del SDK y procesar los datos
}

override fun onGuidanceMessage(message: String) {
// Mensajes de guía durante el escaneo
Log.d("OCR_SDK", "Mensaje de guía: $message")
// Puedes parsear el "message" para obtener el código
val code = getCodeFromJsonString(message)
when (code) {
"UX_REQUEST_SIDE_BACK" -> Log.d("OCR_SDK", " -> Se requiere escanear la parte trasera.")
"UX_REQUEST_SIDE_FRONT" -> Log.d("OCR_SDK", " -> Se requiere escanear la parte frontal.")
// Manejar otros códigos si es necesario
}
}

override fun onFailure(error: String) {
// Ocurrió un error que impidió completar el escaneo
Log.e("OCR_SDK", "Error de escaneo: $error")
// Cerrar o salir de la pantalla del SDK y notificar al usuario
}

override fun onCancel(message: String) {
// El escaneo fue cancelado (por el usuario o por límite de tiempo)
Log.w("OCR_SDK", "Escaneo cancelado: $message")
// Cerrar o salir de la pantalla del SDK y notificar al usuario
}
}
}

// Invocar el Composable DicioCamera
DicioCamera(
callback = ocrCallback,
applicationID = myApplicationId,
token = token, // El token obtenido previamente
urlBase = myUrlBase, // La URL base de tu API
seconds = 60, // Tiempo máximo para el escaneo
)
}

// Función de ayuda para extraer el código del mensaje JSON
fun getCodeFromJsonString(jsonString: String): String? {
return try {
val jsonObject = JSONObject(jsonString)
if (jsonObject.has("Code")) {
jsonObject.getString("Code")
} else {
null
}
} catch (e: JSONException) {
e.printStackTrace()
null
}
}

Parámetros de DicioCamera

ParámetroTipoDescripciónRequeridoValor por Defecto
callbackOcrCallbackImplementación de la interfaz OcrCallback para recibir resultados, mensajes de guía, errores y cancelaciones del SDK.SíNinguno
applicationIDStringTu ID de aplicación. Usado internamente por el SDK para la gestión de licencia.SíNinguno
tokenStringToken de autenticación. Usado por el SDK para validar la sesión y obtener la licencia desde tu API. Debe ser un token válido.SíNinguno
urlBaseStringLa URL base de tu API donde el SDK validará el token y obtendrá la configuración de la licencia.SíNinguno
secondsIntDuración máxima permitida para el proceso de escaneo. Si se excede, el SDK se cancelará automáticamente con el código TIMEOUT_CANCEL.No50
styledScreenOcrStyledObjeto que permite personalizar la apariencia de la interfaz del SDK (colores, textos, logo).NoOcrStyled()

3. Manejo de Resultados y Eventos

Debes implementar la interfaz OcrCallback para recibir las respuestas del SDK.

OcrCallback.kt

data class OcrResult(
val resultData: String,
val faceImageBase64: String,
val frontImageBase64: String,
val backImageBase64: String
)

interface OcrCallback {
// Llamado cuando el escaneo se completa exitosamente y los datos son extraídos
fun onSuccess(result: OcrResult)

// Llamado para proveer mensajes de guía al usuario durante el escaneo
fun onGuidanceMessage(message: String) // Mensaje JSON con código y descripción

// Llamado cuando ocurre un error que impide completar el escaneo
fun onFailure(error: String) // Mensaje descriptivo de error

// Llamado cuando el proceso de escaneo es cancelado
fun onCancel(message: String) // Mensaje descriptivo de cancelación (ej. usuario, timeout)
}

Métodos a implementar

1. onSuccess:

  • Descripción: Invocado cuando la verificación OCR es exitosa.
  • Parámetros:
    • result: Objeto OcrResult que contiene el resultData (JSON) y las imágenes extraídas (faceImageBase64, frontImageBase64, backImageBase64).

2. onGuidanceMessage:

  • Descripción: Invocado durante el proceso de escaneo.
  • Parámetros:
    • message: Eventos UX en formato JSON.
  • Tabla de Códigos:
CódigoDescripción
UX_REQUEST_SIDE_FRONTSe solicita al usuario escanear la parte frontal del documento.
UX_REQUEST_SIDE_BACKSe solicita al usuario escanear la parte trasera del documento.
DOCUMENT_NOT_FOUNDEl documento no fue detectado en la cámara.
UX_DOCUMENT_NOT_FULLY_VISIBLEEl documento no es completamente visible.
UX_DOCUMENT_LOCATEDEl documento ha sido detectado y localizado con éxito.
UX_DOCUMENT_TOO_FAREl documento está muy lejos de la cámara.
UX_DOCUMENT_TOO_CLOSEEl documento está muy cerca de la cámara.
UX_TOO_CLOSE_TO_EDGEEl documento está muy cerca del borde de la cámara.
UX_DOCUMENT_TOO_TILTEDEl documento está muy inclinado.
UX_BLUR_DETECTEDSe ha detectado desenfoque. La imagen no es nítida.
UX_GLARE_DETECTEDSe ha detectado brillo o reflejo. Evita la luz directa.
UX_WRONG_SIDESe está intentando escanear el lado equivocado del documento.
UX_SCANNING_DONEEl proceso de escaneo UX (captura visual) ha terminado.
UX_UNKNOWN_EVENTSe recibió un evento desconocido de la interfaz de usuario.

3. onFailure:

  • Descripción: Invocado cuando hay un error durante el proceso.
  • Parámetro:
    • error: Mensaje descriptivo del error en formato JSON.
  • Tabla de Códigos:
CódigoDescripción
DOCUMEN_NOT_VALIDEl documento escaneado no es válido.
ERROR_PERMISSIONPermisos de cámara denegados.
ERROR_SDKError interno del SDK o licencia inválida.
UNRECOVERABLE_ERROROcurrió un error crítico no recuperable.
TOKEN_EMPTYEl token está vacío o falta.
NO_INTERNETSin conexión a internet.
LICENCE_OR_TOKEN_ERRORLicencia o token inválido.
TOKEN_NOT_VALIDToken inválido.

4. onCancel:

  • Descripción: Invocado cuando el usuario cancela la verificación.
  • Parámetro:
    • message: Mensaje explicando por qué se canceló el proceso.
  • Tabla de Códigos:
Código de CancelaciónDescripción
TIMEOUT_CANCELLa sesión se canceló por exceder el tiempo de espera (1 minuto).
USER_CANCELEl usuario canceló el proceso.

4. Personalización de la Interfaz (Opcional)

Si deseas personalizar la apariencia de la pantalla de escaneo (textos, colores, logo), puedes hacerlo proveyendo un objeto OcrStyled al parámetro styledScreen.

El objeto OcrStyled es un data class con los siguientes campos:

OcrStyled.kt

val styledSdk = OcrStyled(
modalTitle = R.string.ocr_modal_title_instructions,
modalContent = R.string.ocr_modal_subtitle_instructions,

timeoutModalTitle = R.string.ocr_modal_timeout_title_instructions,
timeoutModalContent = R.string.ocr_modal_timeout_subtitle_instructions,

logo = R.drawable.logo,

titleColor = Color.Black,
contentColor = Color.Gray,
iconColor = Color.White,
scannerColor = Color.White,

timeoutModalButtonText = R.string.button_cancel,

backgroundColor = Color.White
)

Ejemplo de uso:

Usage.kt

DicioCamera(
callback = sdkCallback,
applicationID = viewModel.aplicationId,
token = token,
urlBase = viewModel.urlBase,
seconds = viewModel.timeOut,
styledScreen = styledSdk
)