> 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/videollamada.md).

# Videollamada - Videocall

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

La captura facial se realiza con el ***VideoCall Component***.

Este componente se encarga de gestionar la comunicación entre un usuario y un agente (videoasistencia). Sus principales procesos son:

* Gestión interna de cámaras, micro y permisos.
* Conexión con los servicios.

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

La dependencia específica del componente es:

```
implementation "com.facephi.androidsdk:videocall_component:$version"
```

***

## Controladores disponibles

| **Controlador**         | **Descripción**                                           |
| ----------------------- | --------------------------------------------------------- |
| VideoCallController     | Controlador principal de videollamada                     |
| StopVideoCallController | Detener la compartición de pantalla y la llamada en curso |

## 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(
    VideoCallController(VideoCallConfigurationData(...))
)
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 *VideoCallConfigurationData* que será la configuración del controlador del componente.

La configuración básica necesaria no necesitará ningún parámetro:

```kotlin
VideoCallConfigurationData()
```

## Recepción del resultado

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 'VideoCallError'.

Lista de errores:

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

### Recepción del resultado correcto - *data* <a href="#id-62-recepcion-del-resultado-correcto-data" id="id-62-recepcion-del-resultado-correcto-data"></a>

En la parte de SdkResult.Success - *data*, dispondremos de la clase *VideoCallResult* que tendrá una única propiedad.

* `sharingScreen`: Indica si la llamada sigue activa con compartición de pantalla iniciada.

Cuando el resultado sea Success y esté activo el flag *sharingScreen* se podrá activar compartir pantalla.

***

## 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 *VideoCallConfigurationData* que será la configuración del controlador del componente.

A continuación se detallan todos los campos que forman parte de esta clase.

Los campos incluidos en la configuración, 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.
* `activateScreenSharing`: Activar la opción de compartir pantalla en la llamada.
* `timeout`: Tiempo de espera para que un agente coja la llamada (ms).

### Compartir pantalla <a href="#id-72-compartir-pantalla" id="id-72-compartir-pantalla"></a>

Cuando el usuario active la funcionalidad de compartir pantalla se recibirá en el controlador el resultado con "sharingScreen = true". Esto indica que la llamada sigue en curso.

```kotlin
val result = SDKController.launch(
    VideoCallController(VideoCallConfigurationData(activateScreenSharing = true)))

when (result) {
    is SdkResult.Error -> {
        Napier.d("VideoCall: ERROR - ${result.error.name}")
    }

    is SdkResult.Success -> {
            Napier.d("VideoCall: OK - ScreenSharing: ${result.data.sharingScreen}")
        }
    }

```

Para detener la llamada se hará uso del controlador StopVideoCallController.

```kotlin
val controller = StopVideoCallController()

controller.setOutput { state ->
    Napier.d { "VIDEOCALL: SCREEN SHARING STATE: ${state.name}" }
}
viewModelScope.launch {
    SDKController.launch(controller)
}
```

Los posibles estados son:

```kotlin
AGENT_HANGUP,
PERMISSION_ERROR,
NETWORK_CONNECTION_ERROR,
UNKNOWN_ERROR,
SHARING,
CANCEL_BY_USER,
FINISH
```

El estado que indica la finalización completa de la llamada es FINISH.

***

## 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>
    <!-- Video call -->
    <string name="video_widget_call_component_text_waiting_agent_title">Connecting with an assistant...</string>
    <string name="video_widget_call_component_local">You</string>
    <string name="video_widget_call_component_agent">Assistant</string>
    <string name="video_widget_call_component_exit">Exit</string>
    <string name="video_widget_call_component_text_finish">Video assistance is complete</string>
    <string name="video_widget_call_component_phone_button_alt">Phone</string>
    <string name="video_widget_call_component_switch_button_alt">Switch camera</string>
    <string name="video_widget_call_component_restart">RETRY</string>
    <string name="video_widget_call_component_timeout_title">Time exceeded</string>
    <string name="video_widget_call_component_timeout_desc">Unable to connect with an agent.</string>
    <string name="video_widget_call_component_internal_error_title">There was a technical problem</string>
    <string name="video_widget_call_component_internal_error_desc">An assistant could not be reached.</string>
    <string name="video_widget_call_component_close_button_alt">Close</string>
    <string name="video_widget_call_component_back_button_alt">Back</string>
    <string name="video_widget_call_component_exit_alert_question">Do you want to end the call?</string>
    <string name="video_widget_call_component_exit_alert_finish">End</string>
    <string name="video_widget_call_component_exit_alert_accept">Accept</string>
    <string name="video_widget_call_component_exit_alert_cancel">Cancel</string>
    <string name="video_widget_call_component_skip">SKIP</string>
    <string name="video_widget_call_component_share_button_alt">Share screen</string>
</resources>

```

### Colores <a href="#id-82-colores" id="id-82-colores"></a>

```xml
<color name="colorVideoCallActionsBackground">#30333d</color>
<color name="colorVideoCallButtonBackground">#FF526080</color>
```

### Animaciones <a href="#id-83-animaciones" id="id-83-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_call_anim_waiting.json
```

### Vistas externas <a href="#id-84-vistas-externas" id="id-84-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 IVideoCallErrorDiagnosticView {
    @Composable
    fun Content(
        error: VideoCallError,
        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.

\ <br>
