> For the complete documentation index, see [llms.txt](https://docs.caf.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.caf.io/sdk-lite/sdk-lite-english-pt-br/configuracao/android/configuration/starting-liveness-flow.md).

# Iniciando o Fluxo de Liveness

O fluxo de Liveness tem três etapas:

1. **`configure()`** : forneça suas credenciais ao SDK, uma vez.
2. **`prewarm()`** : busque a sessão de liveness enquanto o usuário ainda está na tela anterior.
3. **`startLiveness()`** : abra a câmera e receba o resultado.

{% hint style="info" %}
Dividir o trabalho dessa forma permite que a requisição de rede aconteça antes de o usuário pedir a câmera, então a câmera abre visivelmente mais rápido.
{% endhint %}

## Configurar

Crie um `CafLivenessConfig` e passe-o para `configure()`. Isso apenas armazena o contexto e a configuração. Nenhuma requisição de rede é feita, então é seguro chamar antecipadamente.

{% code title="MainActivity.kt" %}

```kotlin
val livenessConfig = CafLivenessConfig(
    mobileToken = "<SEU_TOKEN_MÓVEL>",
    stage = CafStage.PROD,
    personId = "<ID_DA_PESSOA>",
    showLoading = true,
    enableSecurity = true
)
CafFaceLivenessLite.instance.configure(context, livenessConfig)
```

{% endcode %}

### `CafLivenessConfig` Parâmetros

| Parâmetro         | Padrão | Descrição                                                                                                                                                                                                   |
| ----------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `mobileToken`     | —      | **Obrigatório.** O `sessionToken` solicitado pelo seu backend para esta tentativa. Veja [Configuração do backend](/sdk-lite/sdk-lite-english-pt-br/configuracao/backend/setup.md).                          |
| `personId`        | —      | **Obrigatório.** Identifica o usuário para o processo de liveness.                                                                                                                                          |
| `estágio`         | `PROD` | Ambiente de destino: `PROD`, `BETA`, ou `DEV`.                                                                                                                                                              |
| `showLoading`     | `true` | Mostra indicadores de carregamento durante o processamento quando **true**.                                                                                                                                 |
| `enableSecurity`  | `true` | Quando **ativado**, executa a validação de segurança do dispositivo antes e durante o liveness. Veja [Verificações de segurança](/sdk-lite/sdk-lite-english-pt-br/configuracao/android/security-checks.md). |
| `uiCustomization` | `null` | Identidade visual para a tela de liveness. Veja [Personalização da interface](/sdk-lite/sdk-lite-english-pt-br/configuracao/android/configuration/ui-customization.md).                                     |

## Pré-aquecer

Chame `prewarm()` assim que você souber que o Liveness está chegando — quando o usuário alcançar a tela anterior ou quando o botão "Start" se tornar visível. O SDK cria a sessão de Liveness em segundo plano para que `startLiveness()` não precise esperar por isso.

```kotlin
CafFaceLivenessLite.instance.prewarm()
```

`prewarm()` não recebe parâmetros, retorna imediatamente e não informa nada — o trabalho continua em segundo plano. Ele exige `configure()` ter sido chamado primeiro.

{% hint style="info" %}
`prewarm()` é opcional. Se você o omitir, `startLiveness()` cria a sessão por conta própria e tudo funciona exatamente da mesma forma — só sem o ganho de velocidade.
{% endhint %}

{% hint style="warning" %}
A sessão pré-aquecida é válida por 90 segundos e é usada no máximo uma vez. Se o período passar, ou a sessão já tiver sido usada por uma anterior `startLiveness()`, uma nova é obtida automaticamente.
{% endhint %}

## Iniciar Liveness

Chame `startLiveness()` com um callback para tratar os resultados e eventos disparados durante o fluxo de Liveness.

```kotlin
CafFaceLivenessLite.instance.startLiveness { event ->
    when (event) {
        is LivenessLiteEvent.Success -> {
            // Tratar sucesso
        }
        is LivenessLiteEvent.Failure -> {
            // Tratar falha
        }
        is LivenessLiteEvent.Error -> {
            // Tratar erro
        }
        LivenessLiteEvent.Cancelled -> {
            // O usuário abandonou o fluxo
        }
        LivenessLiteEvent.Loading -> {
            // Mostrar um indicador de carregamento
        }
        LivenessLiteEvent.Loaded -> {
            // Ocultar o indicador de carregamento
        }
    }
}
```

{% hint style="info" %}
Se um pré-aquecimento ainda estiver em andamento quando `startLiveness()` for chamado, o SDK espera por ele em vez de iniciar uma segunda requisição — então chamar `prewarm()` pouco antes nunca é desperdício.
{% endhint %}

## Exemplo completo

```kotlin
class SelfieIntroFragment : Fragment() {

    private val livenessConfig = CafLivenessConfig(
        mobileToken = "<SEU_TOKEN_MÓVEL>",
        stage = CafStage.PROD,
        personId = "<ID_DA_PESSOA>",
        showLoading = true,
        enableSecurity = true
    )

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // O usuário está na tela anterior ao Liveness: prepare a sessão agora.
        CafFaceLivenessLite.instance.configure(requireContext(), livenessConfig)
        CafFaceLivenessLite.instance.prewarm()

        startButton.setOnClickListener {
            CafFaceLivenessLite.instance.startLiveness { event ->
                // Tratar eventos
            }
        }
    }
}
```

## Eventos

Cada execução entrega seus eventos ao listener passado para `startLiveness()`, na thread principal. Uma execução sempre termina com exatamente um de `Sucesso`, `Falha`, `Erro` ou `Cancelado`.

| Evento                                                                       | Quando ele é entregue                                                                                                                                                                                                        |
| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Success(signedResponse: String)`                                            | A captura foi concluída. Encaminhe o `signedResponse` para o seu backend.                                                                                                                                                    |
| `Failure(signedResponse: String, type: CafFailureType, description: String)` | A captura foi executada, mas não foi aprovada. Oriente o usuário com o `parâmetro` e encaminhe o `signedResponse` para o seu backend. Veja [Falhas móveis](/sdk-lite/sdk-lite-english-pt-br/tratamento-de-falhas/mobile.md). |
| `Error(type: CafLivenessErrorType, description: String, cause: Throwable)`   | A execução não pôde iniciar nem terminar. Nenhum `signedResponse`. Veja [Erros do Android](/sdk-lite/sdk-lite-english-pt-br/tratamento-de-erros/android.md).                                                                 |
| `Cancelado`                                                                  | O usuário fechou a tela de captura. Volte para a tela anterior sem uma mensagem de erro.                                                                                                                                     |
| `Carregando` / `Carregado`                                                   | O SDK começou / parou de esperar. Use isso para mostrar ou ocultar seu próprio indicador de carregamento.                                                                                                                    |

{% hint style="warning" %}
Nunca decida o resultado do liveness no dispositivo. Seu backend valida o `signedResponse` e obtém o resultado final.
{% endhint %}

## Alterando o usuário ou as credenciais

Se você chamar `configure()` novamente com um/uma diferente `mobileToken` ou `personId`, qualquer sessão pré-aquecida é descartada, já que ela pertence ao usuário anterior. Chame `prewarm()` novamente após reconfigurar.

## Liberando o SDK

`release()` cancela o Liveness em andamento e descarta qualquer sessão pré-aquecida. A configuração de `configure()` é mantida, então você pode chamar `prewarm()` ou `startLiveness()` novamente sem reconfigurar.

```kotlin
CafFaceLivenessLite.instance.release()
```

## Depuração

Para ver os logs do SDK no Logcat, ative o logging. Os logs só aparecem quando seu app é depurável; em builds de release a flag é ignorada.

```kotlin
CafFaceLivenessLite.isLogEnabled = true
```

## Próxima etapa

Encaminhe o `signedResponse` para o seu backend, que o valida e recupera o resultado: [Configuração do backend](/sdk-lite/sdk-lite-english-pt-br/configuracao/backend/setup.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.caf.io/sdk-lite/sdk-lite-english-pt-br/configuracao/android/configuration/starting-liveness-flow.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
