Skip to main content

Captura de documentos

Descripción General

Esta documentación proporciona una guía detallada para desarrolladores sobre cómo integrar e implementar el componente Composable DicioCameraDocument en sus aplicaciones Android con Jetpack Compose. El SDK ha sido rediseñado para ofrecer una integración nativa en Compose, permitiendo la captura de imágenes de documentos de manera eficiente y segura.

Requisitos Previos

Compatibilidad

LenguajeVersión AndroidVersión SDKAndroid Studio
Kotlin/JavaAndroid 7+24+Jellyfish+
  1. Permisos en el Manifest: Asegúrate de agregar los siguientes permisos en tu archivo AndroidManifest.xml:
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
  1. Configuración del Proyecto: Añade las siguientes dependencias en tu archivo build.gradle:
build.gradle
// Dependencia del SDK de Dicio
implementation(files("libs/documentcapturesdk.aar"))

// Dependencias de CameraX requeridas por el SDK
implementation(libs.androidx.camerax.core)
implementation(libs.androidx.camerax.camera2)
implementation(libs.androidx.camerax.lifecycle)
implementation(libs.androidx.camerax.view)

implementation(libs.androidx.lifecycle.viewmodel.compose)
// El SDK utiliza internamente un ViewModel, es recomendable tener esta dependencia
implementation(libs.androidx.lifecycle.viewmodel.compose)

// Dependencia para realizar las llamadas de red para la licencia
implementation(libs.okhttp3)
  1. Configuración del Proyecto: Añade las siguientes dependencias en tu archivo libs.versions.toml:
libs.versions.toml
[versions]
camerax = "1.3.0" # O una versión más reciente y estable
lifecycle = "2.8.1"
okhttp = "4.12.0"

[libraries]
androidx-camerax-core = { group = "androidx.camera", name = "camera-core", version.ref = "camerax" }
androidx-camerax-camera2 = { group = "androidx.camera", name = "camera-camera2", version.ref = "camerax" }
androidx-camerax-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }
androidx-camerax-view = { group = "androidx.camera", name = "camera-view", version.ref = "camerax" }
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
okhttp3 = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }

Integración y Uso

El SDK se integra como un componente @Composable. Simplemente llama a la función DicioCameraDocument dentro de tu jerarquía de Compose. El componente manejará internamente la carga y validación de la licencia antes de mostrar la cámara.

Parámetros del Composable

Composable.kt
@Composable
fun DicioCameraDocument(
styledScreen: dicioDocumentStyled = dicioDocumentStyled(),
callback: DicioCaptureCallback,
applicationID: String,
token: String,
urlBase: String
)
  • styledScreen:(opcional): Un objeto dicioDocumentStyled para personalizar la apariencia de la pantalla.
  • callback: Implementación de DicioCaptureCallback para manejar los eventos del SDK.
  • applicationID: (Requerido) El ID de la aplicación proporcionado para la validación de la licencia.
  • token: (Requerido) El token de autenticación (Bearer Token) para autorizar las solicitudes.
  • urlBase:(Requerido) La URL base del servidor donde se validará el token y la licencia.

Personalización (Programática)

La personalización de la interfaz se realiza proveyendo un objeto de configuración dicioDocumentStyled al componente. Clase dicioDocumentStyled

PropiedadTipoDescripciónValor por Defecto
titleInt (StringRes)ID del recurso de texto para el título.R.string.dicio_dc_title
subtitleInt (StringRes)ID del recurso de texto para el subtítulo.R.string.dicio_dc_subtitle
backgroundColorColorColor de fondo de la pantalla de captura.Color(0xFF000000) (Negro)
titleColorColorColor del texto del título.Color.White
subtitleColorColorColor del texto del subtítulo.Color.White
buttonCaptureColorColorColor del botón de captura.Color.White
buttonCancelColorColor Color del icono para cerrar/cancelar.Color.White

Implementación de Callbacks

Debes implementar la interfaz DicioCaptureCallback para recibir las respuestas y eventos del SDK.

MétodoDescripciónParámetros
DicioCaptureOnSuccessSe invoca cuando la captura de imagen es exitosa.image: Imagen capturada en formato String (Base64).
DicioCaptureOnFailureSe invoca cuando hay un error durante el proceso.errorMessage: Mensaje de error en formato String (JSON).
DicioCaptureOnCancelSe invoca cuando el usuario cancela la captura.cancelMessage: Mensaje explicando por qué se canceló.
DicioCaptureOnInfoCameraProporciona información sobre el estado de la cámara.message: Mensaje de información en formato String (JSON).

Ejemplo de Uso Completo

El siguiente ejemplo muestra cómo integrar DicioCameraDocument, pasar los parámetros de validación y manejar el resultado.

Ejemplo de Uso

@Composable
fun DocumentCaptureScreen(
// Estos valores deben venir de tu lógica de negocio
appId: String,
userToken: String,
apiBaseUrl: String
) {
var capturedImageBase64 by remember { mutableStateOf<String?>(null) }

if (capturedImageBase64 == null) {
// Muestra el componente del SDK
DicioCameraDocument(
// Pasa los parámetros requeridos para la validación
applicationID = appId,
token = userToken,
urlBase = apiBaseUrl,

// Implementa el callback para recibir los resultados
callback = object : DicioCaptureCallback {
override fun DicioCaptureOnSuccess(image: String) {
capturedImageBase64 = image
println("Imagen capturada con éxito.")
}

override fun DicioCaptureOnFailure(errorMessage: String) {
// El SDK ya muestra errores de licencia, pero aquí
// puedes manejar otros errores o registrarlos.
println("Error en captura: $errorMessage")
}

override fun DicioCaptureOnCancel(cancelMessage: String) {
println("Captura cancelada: $cancelMessage")
// Aquí puedes navegar hacia atrás
}

override fun DicioCaptureOnInfoCamera(message: String) {
println("Info Cámara: $message")
}
}
)
} else {
// Muestra la foto capturada con un botón para volver
CapturedPhotoResult(
base64Image = capturedImageBase64,
onRetake = {
capturedImageBase64 = null // Vuelve a la cámara
}
)
}
}

Manejo de Errores y Códigos de Respuesta

Los mensajes se entregan como una cadena con formato JSON con las claves "Code" y "Message".

Errores de Licencia y Conectividad Estos errores ocurren antes de que la cámara se muestre. El SDK mostrará un mensaje en pantalla y también lo notificará vía DicioCaptureOnFailure.

Código de errorDescripción
NO_INTERNETNo hay conexión a internet disponible para validar la licencia.
APPLICATION_ID_EMPTYEl parámetro applicationID está vacío.
BASE_URL_EMPTYEl parámetro urlBase está vacío.
TOKEN_EMPTYEl parámetro token está vacío.
TOKEN_NOT_VALIDEl token proporcionado no es válido o ha expirado.
SERVER_ERROR_NOT_LICENCELa respuesta del servidor no contenía una clave de licencia.
JSON_PARSE_ERRORError al procesar la respuesta del servidor.
SERVER_ERRORError general de comunicación con el servidor de licencias.

Errores de Cámara

Código de errorDescripción
ERROR_PERMISSIONPermiso de cámara denegado por el usuario.
ERROR_CAMERAError general al iniciar o vincular la cámara.
ERROR_TAKING_PHOTOError durante la captura de la foto (devuelto por CameraX).
ERROR_IMAGE_FORMATEl formato de la imagen de la cámara no es JPEG.

Mensajes de Información de Cámara

Código de informaciónDescripción
CAMERA_STARTEDLa cámara se inició correctamente y está lista para capturar.
CAMERA_TAKE_PHOTOLa foto ha sido tomada y está siendo procesada. Exportar a Hojas de cálculo