Skip to main content

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

LenguajeVersión AndroidVersión SDKAndroid StudioKotlin
Kotlin/JavaAndroid 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):

AndroidManifest.xml
<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:

  1. libs.versions.toml:
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" }
  1. build.gradle (Nivel de módulo/App):
build.gradle
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ámetroTipoDescripciónObligatorioValor por defecto
tokenStringToken de autenticación de DICIO válido para autorizar el uso del SDK.Ninguno
callbackVideoRecorderCallbackImplementación para recibir el video resultante y los eventos del SDK.Ninguno
applicationIDStringEl ID de tu aplicación. Utilizado para validación y licencias.Ninguno
urlBaseStringURL base del servidor para validar el token y obtener la licencia.Ninguno
videoDurationIntDuración del video en segundos. Solo se admiten valores de 10 a 30.No10
styledScreenVideoStyledObjeto que permite personalizar los textos, colores primarios y de fondo.NoVideoStyled()

Manejo de Resultados y Eventos

Debes implementar la interfaz VideoRecorderCallback para reaccionar a todos los flujos de la videograbación.

VideoRecorderCallback
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:

  1. onSuccess:

    • Descripción: Evento de conclusión exitosa. Devuelve la ruta absoluta al archivo .mp4 almacenado temporalmente en la caché del dispositivo (el archivo se reemplaza con cada intento para ahorrar espacio).
    • Parámetro: videoFilePath (Ruta física del video).
  2. onCameraInfo:

    • Descripción: Envía métricas y actualizaciones de hardware. El formato entregado es un JSON estructurado.

    • Códigos Comunes:

      CódigoDescripció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.
  3. 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ódigoDescripción
      VIDEO_DURATION_NOT_VALIDEl parámetro videoDuration se 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.
  4. 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.

VideoStyled
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í
)