> 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/docs.facephi-pt-br/sdks/sdk-mobile/android-sdk/componentes-modulos/videollamada.md).

# Videochamada - Videocall

## Introdução <a href="#id-1-introduccion" id="id-1-introduccion"></a>

A Captura Facial é realizada com o ***Componente VideoCall***.

Este componente é responsável por gerenciar a comunicação entre um usuário e um agente (videoassistência). Seus principais processos são:

* Gestão interna de câmeras, microfone e permissões.
* Conexão com os serviços.

Na seção de [Lançamento simplificado](/docs.facephi-pt-br/sdks/sdk-mobile/android-sdk/inicializacion/lanzamiento-simplificado.md) são detalhados os passos necessários para a integração básica do SDK. Nesta seção é adicionada a informação para o lançamento deste componente.

## Dependência

A dependência específica do componente é:

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

***

## Controladores disponíveis

| **Controlador**         | **Descrição**                                             |
| ----------------------- | --------------------------------------------------------- |
| VideoCallController     | Controlador principal de Videochamada                     |
| StopVideoCallController | Parar o compartilhamento de tela e a chamada em andamento |

## Lançamento simplificado <a href="#id-4-lanzamiento-simplificado" id="id-4-lanzamiento-simplificado"></a>

Uma vez iniciado o SDK e criada uma nova operação, será possível lançar o componente. Será possível fazer uso de qualquer um de seus controladores para executar sua funcionalidade.

Lançamento:

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

## Configuração básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para iniciar o componente atual, deverá ser criado um objeto *VideoCallConfigurationData* que será a configuração do controlador do componente.

A configuração básica necessária não precisará de nenhum parâmetro:

```kotlin
VideoCallConfigurationData()
```

## Recebimento do resultado

O lançamento retornará as informações no formato SdkResult. Podendo diferenciar-se entre um lançamento correto e um incorreto:

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

### Recebimento de erros <a href="#id-61-recepcion-de-errores" id="id-61-recepcion-de-errores"></a>

Os erros serão retornados como um objeto 'VideoCallError'.

Lista de erros:

* VCL\_ACTIVITY\_RESULT\_MSG\_ERROR: O resultado da atividade está incorreto
* VCL\_APPLICATION\_CONTEXT\_ERROR: O contexto de aplicação necessário é nulo
* VCL\_CANCEL\_BY\_USER: O usuário cancelou o processo
* VCL\_CANCEL\_LAUNCH: Foi feito um cancelamento geral do SDK
* VCL\_COMPONENT\_LICENSE\_ERROR: A Licença do componente não está correta
* VCL\_EMPTY\_LICENSE: A String de Licença está vazia
* VCL\_FACE\_DETECTION\_TIMEOUT: Nenhum rosto foi detectado
* VCL\_FETCH\_DATA\_ERROR: Erro na coleta do resultado
* VCL\_FLOW\_ERROR: Erro no processo de flow
* VCL\_INITIALIZATION\_ERROR: Erro de Inicialização
* VCL\_MANAGER\_NOT\_INITIALIZED: Os managers são nulos
* VCL\_NETWORK\_CONNECTION: Erro na conexão com a internet
* VCL\_NO\_DATA\_ERROR: Os dados de entrada são nulos
* VCL\_OPERATION\_NOT\_CREATED: Não há nenhuma operação em andamento
* VCL\_PERMISSION\_ERROR: O usuário rejeitou as permissões
* VCL\_SCREEN\_SHARING\_PERMISSION\_ERROR: O usuário rejeitou a permissão para compartilhar tela
* VCL\_SOCKET\_ERROR: Erro na conexão dos serviços
* VCL\_TIMEOUT: Timeout no processo
* VCL\_VIDEO\_ERROR: Erro no processamento do vídeo
* VCL\_UNKNOWN\_ERROR: Erro desconhecido
* VCL\_VIDEO\_CALL\_ACTIVE: Não é possível iniciar porque já há uma videochamada ativa
* VCL\_VIDEO\_RECORDING\_ACTIVE: Não é possível iniciar porque o processo de gravação de vídeo está ativo

### Recebimento do resultado correto - *data* <a href="#id-62-recepcion-del-resultado-correcto-data" id="id-62-recepcion-del-resultado-correcto-data"></a>

Na parte de SdkResult.Success - *data*, teremos a classe *VideoCallResult* que terá uma única propriedade.

* `sharingScreen`: Indica se a chamada continua ativa com compartilhamento de tela iniciado.

Quando o resultado for Success e o flag estiver ativo *sharingScreen* será possível ativar o compartilhamento de tela.

***

## Informações avançadas <a href="#id-7-informacion-avanzada" id="id-7-informacion-avanzada"></a>

Esta seção amplia as informações do componente.

### Configuração avançada do componente <a href="#id-71-configuracion-avanzada-del-componente" id="id-71-configuracion-avanzada-del-componente"></a>

Para iniciar o componente atual, deverá ser criado um objeto *VideoCallConfigurationData* que será a configuração do controlador do componente.

A seguir, estão detalhados todos os campos que fazem parte desta classe.

Os campos incluídos na configuração, normalmente **não precisam ser informados** pois são preenchidos internamente por meio da licença usada.

Esses campos geralmente são informados **somente** quando o **servidor** es **OnPremise**.

* `url`: Caminho para o socket de vídeo.
* `apiKey`: ApiKey necessária para a conexão com o socket de vídeo.
* `tenantId`: Identificador do tenant que faz referência ao cliente atual, necessário para a conexão com o serviço de vídeo.
* `activateScreenSharing`: Ativar a opção de compartilhar tela na chamada.
* `Timeout`: Tempo de espera para que um agente atenda a chamada (ms).

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

Quando o usuário ativar a funcionalidade de compartilhamento de tela, o resultado será recebido no controlador com "sharingScreen = true". Isso indica que a chamada continua em andamento.

```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 encerrar a chamada, será usado o controlador StopVideoCallController.

```kotlin
val controller = StopVideoCallController()

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

Os possíveis estados são:

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

O estado que indica a finalização completa da chamada é FINISH.

***

## Personalização do componente <a href="#id-8-personalizacion-del-componente" id="id-8-personalizacion-del-componente"></a>

Além das alterações que podem ser feitas no nível do SDK (as quais são explicadas no documento de [Personalização do SDK](/docs.facephi-pt-br/sdks/sdk-mobile/android-sdk/personalizacion.md)), este componente específico permite a modificação de sua interface.

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

Os textos podem ser personalizados adicionando um arquivo XML de recursos no aplicativo cliente e substituindo os valores padrão.

```kotlin

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Videochamada -->
    <string name="video_widget_call_component_text_waiting_agent_title">Conectando com um atendente...</string>
    <string name="video_widget_call_component_local">Você</string>
    <string name="video_widget_call_component_agent">Atendente</string>
    <string name="video_widget_call_component_exit">Sair</string>
    <string name="video_widget_call_component_text_finish">A assistência por vídeo foi concluída</string>
    <string name="video_widget_call_component_phone_button_alt">Telefone</string>
    <string name="video_widget_call_component_switch_button_alt">Alternar câmera</string>
    <string name="video_widget_call_component_restart">TENTAR NOVAMENTE</string>
    <string name="video_widget_call_component_timeout_title">Tempo esgotado</string>
    <string name="video_widget_call_component_timeout_desc">Não foi possível conectar com um atendente.</string>
    <string name="video_widget_call_component_internal_error_title">Houve um problema técnico</string>
    <string name="video_widget_call_component_internal_error_desc">Não foi possível contatar um atendente.</string>
    <string name="video_widget_call_component_close_button_alt">Fechar</string>
    <string name="video_widget_call_component_back_button_alt">Voltar</string>
    <string name="video_widget_call_component_exit_alert_question">Deseja encerrar a chamada?</string>
    <string name="video_widget_call_component_exit_alert_finish">Encerrar</string>
    <string name="video_widget_call_component_exit_alert_accept">Aceitar</string>
    <string name="video_widget_call_component_exit_alert_cancel">Cancelar</string>
    <string name="video_widget_call_component_skip">PULAR</string>
    <string name="video_widget_call_component_share_button_alt">Compartilhar tela</string>
</resources>

```

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

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

### Animações <a href="#id-83-animaciones" id="id-83-animaciones"></a>

Se desejar modificar as animações (lottie) do SDK, é preciso incluir as animações com o mesmo nome na pasta res/raw/ da aplicação.

```
video_call_anim_waiting.json
```

### Views externas <a href="#id-84-vistas-externas" id="id-84-vistas-externas"></a>

É possível modificar completamente as telas do componente mantendo sua funcionalidade e navegação. Para isso, devem ser implementadas as interfaces a seguir:

Tela de diagnóstico de erro:

```kts

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

```

Uma vez criadas as classes que implementam as interfaces, no lançamento do componente será possível adicionar o parâmetro "customViews" para que sejam usadas no SDK.

\ <br>
