LivenessFacetecSDK e o fluxo completo de uma verificação de vivacidade.
API pública
A fachada do SDK fica emcom.vcc.vendor.facetec.sdk.LivenessFacetecSDK e tem quatro funções:
initrecebe aApplication(não umContext) e devolveResult<Unit>. É idempotente — chamadas subsequentes retornam sucesso imediatamente, sem reinicializar a FaceTec, desde que o SDK não tenha sido parado comstop().getSessionDatacoleta ossidde perimeter security, usado pelo seu backend na criação da sessão.startLivenessCheckrequer umaActivitychamadora porque o FaceTec abre sua própria UI a partir dela.stoppara 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 deinit, 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ósinit(), o consumer app deve:
- Chamar
getSessionData()e obter ossid. - Encaminhar o
ssidao seu backend, que cria a sessão e devolvesessionIdesessionToken. - 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.
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.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
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 Flow — Success(data) e Error(data) usam exatamente o mesmo tipo:
friendlyMessage é definido no lado do cliente e é fixo por status — nã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
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