Video Recorder
Descripción General
Esta documentación proporciona una guía detallada para desarrolladores sobre cómo integrar e implementar el SDK de videograbación (Video Recorder) de DICIO en aplicaciones Android utilizando Jetpack Compose. El SDK facilita la grabación de videos de corta duración (para prueba de vida, recolección de consentimiento, etc.) aplicando validaciones de tiempo y control de hardware de manera transparente.
Requisitos Previos
Compatibilidad
| Lenguaje | Versión Android | Versión SDK | Android Studio | Kotlin |
|---|---|---|---|---|
| Kotlin/Java | Android 7+ | 24+ | Jellyfish+ | 2.2.21+ |
Permisos en el Manifest: Asegúrate de declarar los siguientes permisos obligatorios en tu archivo AndroidManifest.xml (el SDK solicita en tiempo de ejecución los permisos de Cámara y Micrófono):
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Configuración del Proyecto: Añade las siguientes dependencias en tus archivos de Gradle/Version Catalogs:
libs.versions.toml:
[versions]
camerax = "1.3.3" // O la versión más reciente compatible de CameraX
[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-video = { group = "androidx.camera", name = "camera-video", version.ref = "camerax" }
androidx-camerax-view = { group = "androidx.camera", name = "camera-view", version.ref = "camerax" }
build.gradle(Nivel de módulo/App):
dependencies {
implementation(files("libs/videorecordersdkjc.aar")) // Archivo AAR del SDK de DICIO
// Dependencias de CameraX obligatorias para el SDK
implementation(libs.androidx.camerax.core)
implementation(libs.androidx.camerax.camera2)
implementation(libs.androidx.camerax.lifecycle)
implementation(libs.androidx.camerax.video)
implementation(libs.androidx.camerax.view)
}
Uso Básico
El SDK se proporciona mediante el Composable DicioVideoCamera. A continuación, un ejemplo de cómo implementar la pantalla que invoca el SDK:
package com.tuapp.yourapp
import ai.dicio.videorecordersdkjc.core.VideoRecorderCallback
import ai.dicio.videorecordersdkjc.ui.screens.camera.DicioVideoCamera
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@Composable
fun VideoSdkScreen(token: String?, urlBase: String) {
// Implementación del Callback
val sdkCallback = remember {
object : VideoRecorderCallback {
override fun onSuccess(videoFilePath: String) {
println("Video guardado en la ruta: $videoFilePath")
// Aquí puedes cerrar la pantalla o subir el archivo al servidor
}
override fun onFailure(errorMessage: String) {
println("Fallo en la videograbación: $errorMessage")
}
override fun onCancel(cancelMessage: String) {
println("Proceso cancelado: $cancelMessage")
}
override fun onCameraInfo(message: String) {
println("Info de cámara: $message")
}
}
}
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
if (token != null) {
DicioVideoCamera(
token = token,
callback = sdkCallback,
applicationID = "tu.application.id", // Reemplaza con tu ID real
urlBase = urlBase,
videoDuration = 15 // Opcional (10 a 30 segundos)
)
} else {
CircularProgressIndicator()
}
}
}
Parámetros de DicioVideoCamera
| Parámetro | Tipo | Descripción | Obligatorio | Valor por defecto |
|---|---|---|---|---|
token | String | Token de autenticación de DICIO válido para autorizar el uso del SDK. | Sí | Ninguno |
callback | VideoRecorderCallback | Implementación para recibir el video resultante y los eventos del SDK. | Sí | Ninguno |
applicationID | String | El ID de tu aplicación. Utilizado para validación y licencias. | Sí | Ninguno |
urlBase | String | URL base del servidor para validar el token y obtener la licencia. | Sí | Ninguno |
videoDuration | Int | Duración del video en segundos. Solo se admiten valores de 10 a 30. | No | 10 |
styledScreen | VideoStyled | Objeto que permite personalizar los textos, colores primarios y de fondo. | No | VideoStyled() |
Manejo de Resultados y Eventos
Debes implementar la interfaz VideoRecorderCallback para reaccionar a todos los flujos de la videograbación.
interface VideoRecorderCallback {
// Se invoca cuando la grabación termina y el usuario la confirma.
fun onSuccess(videoFilePath: String)
// Se invoca ante fallos críticos (ej. permisos denegados, errores de cámara).
fun onFailure(errorMessage: String)
// Se invoca cuando el usuario retrocede o cancela explícitamente.
fun onCancel(cancelMessage: String)
// Emite actualizaciones de estado de la cámara y la grabación.
fun onCameraInfo(message: String)
}
Métodos detallados:
onSuccess:- Descripción: Evento de conclusión exitosa. Devuelve la ruta absoluta al archivo
.mp4almacenado temporalmente en la caché del dispositivo (el archivo se reemplaza con cada intento para ahorrar espacio). - Parámetro:
videoFilePath(Ruta física del video).
- Descripción: Evento de conclusión exitosa. Devuelve la ruta absoluta al archivo
onCameraInfo:Descripción: Envía métricas y actualizaciones de hardware. El formato entregado es un JSON estructurado.
Códigos Comunes:
Código Descripción CAMERA_STARTEDEl visualizador de la cámara se ha inicializado correctamente. CAMERA_STOPPEDEl visualizador se detuvo o liberó el uso del hardware. RECORDING_STARTEDLa captura de video y audio comenzó. ALREADY_RECORDINGSe intentó disparar el botón de inicio pero ya había una grabación corriendo. STOP_RECORDINGSe solicitó la parada del video de manera temprana o al finalizar el tiempo. NO_RECORDINGSe intentó frenar una grabación pero no existía ninguna en curso.
onFailure:Descripción: Disparado ante un error de validación, de permisos o fallos de conexión.
Códigos Comunes (Enviados típicamente como JSON
{"Code": "...", "Message": "..."}):Código Descripción VIDEO_DURATION_NOT_VALIDEl parámetro videoDurationse inicializó fuera del rango permitido de 10 a 30 segundos.ERROR_PERMISSIONSe rechazó el permiso obligatorio de la cámara ( CAMERA).WARNING_PERMISSIONSe rechazó el permiso de audio ( RECORD_AUDIO). El video será grabado mudo.CAMERA_BIND_ERROROcurrió un error inicializando el servicio nativo de CameraX. RECORDING_ERRORProblema almacenando o finalizando el archivo de video. ERROR_JSON_EXCEPTIONError procesando y construyendo respuestas internas del SDK.
onCancel:- Descripción: El usuario interrumpió la grabación cerrando la interfaz a través del botón de regreso (Back button).
- Código de cancelación: Típicamente envía
"USER_CANCEL".
Personalización de la Interfaz (Opcional)
Si necesitas adaptar la interfaz para que empate con la imagen de marca de tu aplicación, puedes hacer uso del objeto VideoStyled.
Esta clase agrupa los recursos de texto (strings) y colores, lo que permite dictar de manera rápida los tonos de fondo, botones, y subtítulos.
package ai.dicio.videorecordersdkjc.ui.models.settings
import ai.dicio.videorecordersdkjc.R
import androidx.compose.ui.graphics.Color
data class VideoStyled (
val title: Int = R.string.dicio_dv_title,
val subtitle: Int = R.string.dicio_dv_subtitle,
val titleSuccess: Int = R.string.dicio_dv_titile_success,
val titleColor: Color = Color(0xff000000), // Negro por defecto
val subtitleColor: Color = Color(0xff313131), // Gris oscuro por defecto
val backgroundColor: Color = Color(0xffffffff), // Fondo Blanco por defecto
val primaryColor: Color = Color(0xff006407), // Verde institucional
val secondaryColor: Color = Color(0xff91ea97), // Verde secundario
)
Ejemplo de cómo inyectarlo en tu vista:
val miEstilo = VideoStyled(
// Personalizamos a una vista oscura (Dark Mode) y botones azules
backgroundColor = Color.Black,
titleColor = Color.White,
subtitleColor = Color.LightGray,
primaryColor = Color(0xFF007BFF) // Azul
)
DicioVideoCamera(
token = token,
callback = sdkCallback,
applicationID = "tu.application.id",
urlBase = "https://tu.url.base",
videoDuration = 10,
styledScreen = miEstilo // <--- Se asigna aquí
)