> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/sdks/sdk-mobile/android-sdk/componentes-modulos/video-identificacion.md).

# Videoidentificación - VideoID

## Introducción <a href="#id-1-introduccion" id="id-1-introduccion"></a>

ELa captura facial se realiza con el ***VideoID Component***.

Este componente se encarga de realizar la grabación de un usuario identificándose, mostrando la cara y su documento de identidad.

* Gestión interna de cámaras, micro y permisos.
* Conexión con los servicios.
* Lectura del OCR y captura del documento.

En el apartado de [Lanzamiento simplificado](/sdks/sdk-mobile/android-sdk/inicializacion/lanzamiento-simplificado.md) se detallan los pasos necesarios para la integración básica del SDK. En esta sección se añade la información para el lanzamiento de este componente.

***

## Dependencia <a href="#id-2-dependencia" id="id-2-dependencia"></a>

La dependencia específica del componente es:

```kotlin
implementation "com.facephi.androidsdk:video_id_component:$version"
```

***

## Controladores disponibles <a href="#id-3-controladores-disponibles" id="id-3-controladores-disponibles"></a>

| **Controlador**            | **Descripción**                                    |
| -------------------------- | -------------------------------------------------- |
| VideoIdController          | Controlador principal de video identificación      |
| SignatureVideoIdController | Controlador para firmar un proceso con una Captura |

***

## Lanzamiento simplificado <a href="#id-4-lanzamiento-simplificado" id="id-4-lanzamiento-simplificado"></a>

Una vez iniciado el SDK y creada una nueva operación se podrá lanzar el componente. Se podrá hacer uso de cualquiera de sus controladores para ejecutar su funcionalidad.

Lanzamiento:

```kotlin
val response = SDKController.launch(
    VideoIdController(VideoIdConfigurationData(...))
)
when (response) {
    is SdkResult.Error -> Napier.d("ERROR - ${response.error.name}")
    is SdkResult.Success -> response.data
}
```

***

## Configuración básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para lanzar el componente actual, se deberá crear un objeto *VideoIdConfigurationData* que será la configuración del controlador del componente.

La configuración básica necesaria para es la siguiente:

```kotlin
VideoIdConfigurationData(
    mode = VideoIdMode.DOCUMENT_FRONT_BACK,
)
```

Los diferentes modos son:

* VideoIdMode.ONLY\_FACE
* VideoIdMode.FACE\_DOCUMENT\_FRONT
* VideoIdMode.FACE\_DOCUMENT\_FRONT\_BACK
* VideoIdMode.DOCUMENT\_FRONT
* VideoIdMode.DOCUMENT\_FRONT\_BACK

***

## Recepción del resultado <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

El lanzamiento devolverá la información en formato SdkResult. Pudiendo diferenciarse entre un lanzamiento correcto y uno incorrecto:

```kotlin
when (response) {
    is SdkResult.Error -> Napier.d("ERROR - ${response.error}")
    is SdkResult.Success -> response.data
}
```

### Recepción de errores <a href="#id-61-recepcion-de-errores" id="id-61-recepcion-de-errores"></a>

Los errores se devolverán como un objeto 'VideoIdError'.

Lista de errores:

* VID\_ACTIVITY\_RESULT\_MSG\_ERROR: El resultado de la actividad es incorrecto
* VID\_APPLICATION\_CONTEXT\_ERROR: El contexto de aplicación necesario es nulo
* VID\_CANCEL\_BY\_USER: El usuario ha cancelado el proceso
* VID\_CANCEL\_LAUNCH: Se ha hecho una cancelación general del SDK
* VID\_COMPONENT\_LICENSE\_ERROR: La licencia del componente no es correcta
* VID\_EMPTY\_LICENSE: El String de licencia está vacío
* VID\_FACE\_DETECTION\_TIMEOUT: No se ha detectado cara
* VID\_FETCH\_DATA\_ERROR: Error en la recogida del resultado
* VID\_FLOW\_ERROR: Error en el proceso de flow
* VID\_INITIALIZATION\_ERROR: Error de inicialización
* VID\_MANAGER\_NOT\_INITIALIZED: Los managers son nulos
* VID\_NETWORK\_CONNECTION: Error en la conexión a internet
* VID\_NO\_DATA\_ERROR: Los datos de entrada son nulos
* VID\_OPERATION\_NOT\_CREATED: No hay ninguna operación en curso
* VID\_PERMISSION\_DENIED: El usuario ha rechazado los permisos
* VID\_SOCKET\_ERROR: Error en la conexión de los servicios
* VID\_TIMEOUT: Timeout en el proceso
* VID\_VIDEO\_ERROR: Error en el procesamiento del vídeo
* VID\_VIDEO\_CALL\_ACTIVE: No se puede iniciar porque ya hay una videollamada activa
* VID\_VIDEO\_RECORDING\_ACTIVE: No se puede iniciar porque el proceso de vídeo grabación está activo

### Recepción de ejecución correcta - *data* <a href="#id-62-recepcion-de-ejecucion-correcta-data" id="id-62-recepcion-de-ejecucion-correcta-data"></a>

En la parte de SdkResult.Success - *data*, dispondremos de la clase VideoIdResult.

El resultado devuelve las imágenes en formato **SdkImage**, es posible extraer el bitmap accediendo a *image.bitmap*. Si se quisiera convertir a base64 se puede utilizar la función:

`Base64.encodeToString(this.toByteArray(), Base64.NO_WRAP)`

Los campos devueltos en el resultado son los siguientes:

**frontDocumentData**

Datos del frente del documento. Incluye:

* documentImage: Imagen del documento
* documentFullImage: Imagen completa capturada
* documentFaceImage: Si se ha encontrado una cara en el documento se devuelve la imagen de la misma.
* iqaOverExposure: Valor numérico entre 0 y 1 que indica el nivel de sobreexposición de la imagen; un valor alto sugiere que la imagen está demasiado iluminada, lo que puede dificultar la lectura del documento.
* iqaReadable: Valor numérico entre 0 y 1 que indica la legibilidad del texto del documento; valores más altos implican que el texto es más claro y fácil de reconocer.
* iqaSharpness: Valor numérico entre 0 y 1 que indica la nitidez de la imagen del documento; valores altos reflejan una imagen más enfocada, lo que mejora la capacidad de extracción de datos.
* documentFaceImageTokenized: Si se ha encontrado una cara en el documento se devuelve la imagen cifrada de la misma.

**backDocumentData**

Datos del reverso del documento. Incluye:

* documentImage: Imagen del documento
* documentFullImage: Imagen completa capturada
* documentFaceImage: Si se ha encontrado una cara en el documento se devuelve la imagen de la misma.
* iqaOverExposure: Valor numérico entre 0 y 1 que indica el nivel de sobreexposición de la imagen; un valor alto sugiere que la imagen está demasiado iluminada, lo que puede dificultar la lectura del documento.
* iqaReadable: Valor numérico entre 0 y 1 que indica la legibilidad del texto del documento; valores más altos implican que el texto es más claro y fácil de reconocer.
* iqaSharpness: Valor numérico entre 0 y 1 que indica la nitidez de la imagen del documento; valores altos reflejan una imagen más enfocada, lo que mejora la capacidad de extracción de datos.
* documentFaceImageTokenized: Si se ha encontrado una cara en el documento se devuelve la imagen cifrada de la misma.

**faceImage**

Imagen del usuario capturada en la primera sección del proceso.

**ocrMap**

Mapa del OCR extraído del documento.

**ocrDiagnostic**

Diccionario con el diagnóstico OCR del documento. Las claves son los campos a validar y los valores son instancias de OcrDiagnostic.

Diagnóstico OCR extraído del documento.

* OK: El OCR es correcto.
* NOT\_FOUND: No se encuentra la clave OCR.
* TOLERANCE\_ERROR: El OCR no es correcto.
* WARNING: El OCR no es correcto, pero es solo una advertencia porque es un campo opcional.

**matchingSidesScore**

Valor numérico entre 0 y 1 que estima el nivel de coincidencia entre las caras del documento (frontal y trasera).

**documentType**

Tipo de documento obtenido.

**personalData**

Conjunto reducido de datos obtenidos del usuario:

* issuer
* documentNumber
* issueDate
* expiryDate
* name
* surname
* fullName
* gender
* birthDate
* birthPlace
* nationality
* address
* nfcKey
* numSupport
* mrz

**speechText**

Texto que el usuario deberá pronunciar durante la grabación del video.

**faceImageTokenized**

Imagen cifrada del usuario capturada en la primera sección del proceso.

***

## Información avanzada <a href="#id-7-informacion-avanzada" id="id-7-informacion-avanzada"></a>

Este apartado amplía la información del componente.

### Configuración avanzada del componente <a href="#id-71-configuracion-avanzada-del-componente" id="id-71-configuracion-avanzada-del-componente"></a>

Para lanzar el componente actual, se deberá crear un objeto \_VideoIdConfigurationData \_ que será la configuración del controlador del componente.

Los campos incluidos en la configuración (**url, apiKey, tenantId**), normalmente **no es necesario que sean informados** ya que se completan internamente a través de la licencia usada.

Estos campos suelen informarse **solo** cuando el **servidor** es **OnPremise**.

**url**

Ruta al socket de video

**apiKey**

ApiKey necesaria para la conexión con el socket de video

**tenantId**

Identificador del tenant que hace referencia al cliente actual, necesario para la conexión con el servicio de video.

**sectionTime**

Indica la duración de las secciones con tiempo asociado (captura facial y cambio de cámara).

**mode**

* ONLY\_FACE: El proceso se realiza capturando la cara del usuario.
* FACE\_DOCUMENT\_FRONT: El proceso se realiza capturando la cara del usuario y la parte delantera del documento de identidad.
* FACE\_DOCUMENT\_FRONT\_BACK: El proceso se realiza capturando la cara del usuario y el documento de identidad completo.
* DOCUMENT\_FRONT: El proceso extrae la información sólo de la cara delantera del documento.
* DOCUMENT\_FRONT\_BACK: El proceso extrae la información sólo del documento completo.

**timeoutServerConnection**

Tiempo máximo de espera en ms para la respuesta del servidor.

**sectionTimeout**

Tiempo máximo permitido para completar una sección (en ms).

**autoFaceDetection**

Activa/Desactiva la detección automática de cara.

**debug**

Habilita la visualización de información adicional útil para el diagnóstico y seguimiento del comportamiento interno.

**countryFilter**

Permite restringir el procesamiento a un conjunto específico de países, aceptando un array de strings que representan los alias en formato ISO3 (código de 3 letras según el estándar ISO 3166-1).

**documentFilter**

Permite restringir los tipos de documentos aceptados durante la captura. Los valores posibles son:

* "IDC": Documento de Identidad (ID Card)
* "PSP": Pasaporte (Passport)
* "DLI": Licencia de Conducir (Driver License)
* "VIS": Visado (Visa)
* "FOC": Tarjeta de Extranjero (Foreign Card)
* "INV": Factura (Invoice)
* "CUS": Documento Personalizado (Custom Document)

**speechText**

Texto que el usuario deberá pronunciar durante la grabación del video.

**ocrValidations**

Diccionario con las validaciones OCR a realizar. Las claves son los campos a validar y los valores son instancias de OcrValidationValue.

OcrValidationValue tiene los siguientes campos:

* value: El valor a validar.
* tolerance: El nivel de tolerancia para la validación.
  * STRICT: Validación estricta.
  * LOW\_TOLERANCE: Validación con baja tolerancia.
  * MEDIUM\_TOLERANCE: Validación con tolerancia media.
  * HIGH\_TOLERANCE: Validación con alta tolerancia.
* validationType: El tipo de validación a realizar.
  * OPTIONAL: Validación opcional.
  * REQUIRED: Validación obligatoria.

**ocrMaxWarnings**

Número máximo de advertencias permitidas en la validación OCR.

**maxRetries**

Número máximo de reintentos permitidos para la validación OCR. El valor por defecto es 3.

***

## Personalización del componente <a href="#id-8-personalizacion-del-componente" id="id-8-personalizacion-del-componente"></a>

Aparte de los cambios que se pueden realizar a nivel de SDK (los cuales se explican en el documento de [Personalización del SDK](/sdks/sdk-mobile/android-sdk/personalizacion.md)), este componente en concreto permite la modificación de su interfaz.

### Textos <a href="#id-81-textos" id="id-81-textos"></a>

Los textos pueden personalizarse añadiendo un fichero XML de recursos en la aplicación cliente y sobrescribiendo los valores por defecto.

```kotlin

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Waiting -->
    <string name="video_widget_id_text_waiting_agent_title">Video ID</string>

    <!-- Process -->
    <string name="video_widget_id_document_front_message">Place the front of your document on the markers</string>
    <string name="video_widget_id_document_front_message_readable">Keep the front of your document on the markers</string>
    <string name="video_widget_id_document_front_message_not_readable">Bring the front of your document closer to the markers</string>
    <string name="video_widget_id_document_back_message">Now place the back of your document</string>
    <string name="video_widget_id_document_back_message_readable">Keep the back of your document on the markers</string>
    <string name="video_widget_id_document_back_message_not_readable">Bring the back of your document closer to the markers</string>
    <string name="video_widget_id_switch_camera_message">Get the document ready while we switch the camera</string>
    <string name="video_widget_id_finish_button">FINISH</string>
    <string name="video_widget_id_ready_button">CONTINUE</string>
    <string name="video_widget_id_exit_alert_cancel">Cancel</string>
    <string name="video_widget_id_exit_alert_question">Are you sure you want to finish the process?</string>
    <string name="video_widget_id_exit_alert_finish">Finish</string>
    <string name="video_widget_id_exit_alert_accept">Accept</string>
    <string name="video_widget_id_close_button_alt">Close</string>
    <string name="video_widget_id_back_button_alt">Back</string>
    <string name="video_widget_id_logo_alt">Logo</string>
    <string name="video_widget_id_face_message">Place your face inside the frame.</string>
    <string name="video_widget_id_multiple_face_message">Multiple faces detected. Place only your face inside the frame</string>
    <string name="video_widget_id_speech_message">Say out loud: "I (name and surname) accept the terms and conditions".</string>
    <string name="video_widget_id_front_document_captured_message">Front of the document captured successfully</string>
    <string name="video_widget_id_document_back_finish_message">Back of the document captured successfully</string>

    <!-- Diagnostic -->
    <string name="video_widget_id_restart_button">RECORD AGAIN</string>
    <string name="video_widget_id_timeout_title">Time exceeded</string>
    <string name="video_widget_id_timeout_desc">We couldn't complete the recording in time. Let's try again.</string>
    <string name="video_widget_id_face_timeout_title">We couldn't detect your face</string>
    <string name="video_widget_id_face_timeout_desc">Place your face on the marker to start the process</string>
    <string name="video_widget_id_internal_error_title">There was a technical problem</string>
    <string name="video_widget_id_internal_error_desc">We apologize. An unexpected error occurred. Try again.</string>
    <string name="video_widget_id_ocr_error_desc">The document could not be read. Please check the lighting and the distance to the camera</string>
    <string name="video_widget_id_finish_message">Video recording completed!</string>
</resources>

```

### Animaciones <a href="#id-82-animaciones" id="id-82-animaciones"></a>

Si se desea modificar las animaciones (lottie) de la SDK habría que incluir las animaciones con el mismo nombre en la carpeta res/raw/ de la aplicación.

```
video_id_anim_doc_and_face.json
video_id_anim_face.json
video_id_anim_loading.json
```

### Vistas externas <a href="#id-83-vistas-externas" id="id-83-vistas-externas"></a>

Es posible modificar completamente las pantallas del componente manteniendo su funcionalidad y navegación. Para ello deben implementarse los interfaces siguientes:

Pantalla de diagnóstico de error:

```kts

interface IVideoIdErrorDiagnosticView {
    @Composable
    fun Content(
        error: VideoIdError,
        onRetry: () -> Unit,
        onClose: () -> Unit,
    )
}

```

Una vez creadas las clases que implementan los interfaces, en el lanzamiento del componente se podrá añadir el parámetro "customViews" para que se utilicen en el SDK.
