Skip to main content
Este guia mostra a API pública do LivenessFacetecSDK e o fluxo completo de uma verificação de vivacidade.

API pública

A fachada do SDK fica em com.vcc.vendor.facetec.sdk.LivenessFacetecSDK e tem quatro funções:
  • init recebe a Application (não um Context) e devolve Result<Unit>. É idempotente — chamadas subsequentes retornam sucesso imediatamente, sem reinicializar a FaceTec, desde que o SDK não tenha sido parado com stop().
  • getSessionData coleta o ssid de perimeter security, usado pelo seu backend na criação da sessão.
  • startLivenessCheck requer uma Activity chamadora porque o FaceTec abre sua própria UI a partir dela.
  • stop para a execução do SDK e libera recursos do sistema.
As chaves internas do SDK são embutidas no AAR em tempo de compilação. Nenhuma chave precisa ser fornecida pelo app consumidor em init ou em qualquer outra chamada.

Configuração

Dados de sessão

Depois de init, chame getSessionData() para obter o ssid — o identificador de perimeter security que seu backend repassa na criação da sessão:
A coleta é best-effort e nunca bloqueia o fluxo: qualquer falha interna devolve Result.success com ssid vazio, apenas registrando o erro internamente. Um ssid vazio não é um erro — siga o fluxo normalmente.

Criação de sessão — responsabilidade do consumer app

O SDK não cria sessões nem se comunica diretamente com o backend de autenticação. Após init(), o consumer app deve:
  1. Chamar getSessionData() e obter o ssid.
  2. Encaminhar o ssid ao seu backend, que cria a sessão e devolve sessionId e sessionToken.
  3. Passar os dois tokens para startLivenessCheck().
O SDK não tem acesso às credenciais do backend do consumer nem conhece o contexto de negócio necessário para criar uma sessão válida. Manter a criação de sessão no consumer app garante flexibilidade (autenticação, multi-tenant) sem acoplar o SDK a uma topologia específica de backend.
O contrato da chamada de criação de sessão está documentado em Serviço.

Estados do Flow

startLivenessCheck retorna um Flow<LivenessFacetecSDKLivenessState> que emite um único caminho Loading → Success ou Loading → Error antes de completar:
Success e Error carregam o mesmo tipo, LivenessFacetecSDKResultData. O que os diferencia é apenas o status: SESSION_COMPLETED sempre chega como Success; qualquer outro valor (cancelamento pelo usuário, erro de câmera, lockout etc.) chega como Error. Não existe um tipo de erro separado — a causa da falha está inteiramente no status.
O estado terminal é decidido pelo status que a própria FaceTec retorna ao fechar a UI de captura, e é emitido imediatamente — sem depender de nenhuma chamada de rede adicional e sem estados intermediários durante a captura.
Retentativa dentro da captura: enquanto a UI do FaceTec está aberta, ela pode pedir ao usuário que tente de novo quantas vezes julgar necessário. Esse retry é interno ao FaceTec e não é exposto ao seu app — o Flow entrega apenas o desfecho final.

Fluxo de uso

1

Inicializar o SDK

Chame LivenessFacetecSDK.init uma única vez, preferencialmente no onCreate() da Application:
init() é idempotente — é seguro chamá-lo em múltiplas Activities ou no onCreate() da Application.
2

Criar sessão no backend

Colete o ssid e chame seu backend para obter os tokens necessários para a captura:
3

Iniciar a verificação

startLivenessCheck() retorna um Flow cold. Se ele for coletado antes de init() ter retornado sucesso, a coleta lança IllegalStateException — a exceção surge no momento da coleta (.collect { } / .catch { }), não na chamada de startLivenessCheck() em si, já que nada roda até haver um coletor. Garanta que init() retornou Result.success(...) antes de iniciar a captura, ou trate a exceção com .catch { }.
4

Tratar o resultado

No caso de sucesso, use o sessionId para reconciliar a captura no backend. No caso de falha, use o status para decidir a ação e o friendlyMessage para exibir ao usuário — veja Solução de problemas.

Campos de LivenessFacetecSDKResultData

Carregado por ambas as variantes do FlowSuccess(data) e Error(data) usam exatamente o mesmo tipo:
friendlyMessage é definido no lado do cliente e é fixo por statusnão vem do backend. Use-o como texto pronto para exibição, e o status como a chave de decisão do seu fluxo.

LivenessFacetecSDKSessionStatus

Enum fechado com os 8 valores possíveis. Apenas SESSION_COMPLETED resulta em Success; todos os outros resultam em Error:
Como o enum é fechado, um when (data.status) exaustivo compila sem else — e passa a falhar na build se a Valid introduzir um valor novo, o que é intencional: você fica sabendo em tempo de compilação.

Exemplos de retorno

Sucesso — liveness aprovado

Falha — usuário cancelou a captura

Cancelamento pelo usuário não é erro técnico — o SDK funcionou corretamente. Trate como desistência no seu app (voltar à tela anterior ou oferecer nova tentativa), sem reportar como falha do SDK.

Exemplo completo

Timeouts de rede

O SDK usa timeouts fixos, não configuráveis pelo consumer: Dimensione a UX de loading e o timeout de fallback do seu app considerando esses valores. Em condições de rede ruim, o Flow pode permanecer em Loading por até 30 segundos antes de emitir o estado terminal.

Parando o SDK

LivenessFacetecSDK.stop() libera os recursos internos do SDK e reseta seu estado, deixando-o como estava antes do primeiro init(). Uma chamada subsequente a init() se comporta como primeiro uso.
Se stop() for chamado durante uma captura em andamento, ela é cancelada imediatamente e o Flow em coleta recebe um Error com status = UNKNOWN_INTERNAL_ERROR — sem travar e sem exceção não tratada. Chamar stop() antes de init(), ou duas vezes seguidas, é um no-op seguro.

O que muda em relação à v9

Se o seu código v9 lia livenessCheck, result, scanResultBlob ou fazia when sobre subclasses de LivenessFacetecSDKError, esses caminhos precisam ser reescritos — nenhum deles existe na v10.

Próximos passos

Customização

Personalize cores, textos e animações da UI do FaceTec

Solução de problemas

Diagnóstico por status e problemas comuns de build