Introdução legada ao SDK
A versão 7.14.0 traz uma forma opcional e mais rápida de inicializar o SDK, com menos linhas de código. Junto com essa atualização de código, lançamos uma nova página de documentação, mais fácil de ler. Para adotar essa nova configuração, confira o guia atualizado.
Sobre o CafSDK
Esta documentação técnica aborda a implementação do CafSDK para Android, detalhando a configuração, a inicialização, a execução dos fluxos de captura e as customizações avançadas.
Atualmente, o CafSDK integra vários módulos: Face Liveness (FL), Document Detector (DD) executados sequencialmente com uma interface de configuração unificada. As versões recentes incluem recursos de segurança aprimorados, melhor desempenho, melhor tratamento de erros e personalização aprimorada do upload.
O que é Face Liveness
É o módulo que valida a autenticidade de um rosto capturado por uma câmera, garantindo que a imagem corresponda a uma pessoa real.
Características técnicas:
caffacelivenessé a base compartilhada. Você deve declarar pelo menos umcaffaceliveness-providers-*artefato para os provedores de liveness que seu produto usa (iProov, PayFace, FaceTec, …).caffaceliveness-uiis opcional e adiciona a UI de Face Liveness do Caf mais customização hooks; omita-o se seu app controlar toda a interface.Configuração de URL para autenticação (
authBaseUrl) e verificação de liveness (livenessBaseUrl).Endpoints de proxy reverso e certificados de segurança (opcional).
Flags para habilitar captura de tela e modo de depuração.
Suporte a vários provedores de liveness quando você declara as dependências correspondentes.
O que é Document Detector
É o módulo que permite a captura e o processamento de documentos (por exemplo, RG, cartão do CPF, passaporte etc.).
Características técnicas:
Configuração de um fluxo passo a passo definido por
DocumentDetectorSteppara captura de documentos.Parâmetros operacionais, como timeout, flags de captura manual e outras configurações.
Possibilidade de usar a câmera para validações de enquadramento ou upload de arquivo de documento.
Comece a usar o SDK
Adicione a dependência
Para que seu projeto Android utilize o CafSDK, é necessário configurar corretamente os repositórios Maven e declarar as dependências do SDK no seu projeto. Esta etapa garante que os artefatos (bibliotecas) sejam baixados e integrados durante a compilação.
Requisitos para adicionar
Os requisitos mínimos para todos os módulos do CafSDK incluem:
API do Android SDK - versão mínima (minSdk)
26
Android SDK API - versão de compilação (compileSDK)
34
Kotlin
1.9.10
Gradle
8.4
Plugin do Android Gradle (AGP)
8.3.2
nome da versão e código da versão são obrigatórios para o funcionamento correto do SDK.
Requisitos Específicos do Módulo
Suporta iProov, PayFacee FaceTec 2D como dependências explícitas de provedores de liveness (veja Passo 2 - Inclua a dependência do CafSDK)
Com tecnologia TensorFlow Lite para processamento de documentos
Suporte a vários tipos de documentos e fluxos de captura
Inclui algoritmos avançados de validação de qualidade
Recursos aprimorados de personalização do upload
Mecanismo de retentativa aprimorado com melhor feedback ao usuário
Recursos de segurança aprimorados
Gerenciamento de instâncias aprimorado para evitar falhas
Passo a passo para adicionar
Passo 1 - Adicione o repositório Maven
Nesta etapa, você precisa informar ao Gradle onde localizar os artefatos do CafSDK e dependências adicionais que possam ser usadas (como as relacionadas ao Caf Face Liveness, DocumentDetector ou FingerPrintJS).
Para isso, configure o arquivo settings.gradle.kts do projeto (geralmente localizado na raiz), incluindo os seguintes repositórios:
Repositório Caf: onde os artefatos do CafSDK estão hospedados.
Repositório iProov: necessário apenas se você incluir o iProov provedor de liveness (
caffaceliveness-providers-iproov-liteoucaffaceliveness-providers-iproov-full).Repositório FingerPrintJS: dependência interna dos módulos.
JitPack: para dependências hospedadas via JitPack (Github).
Repositório Fortface: necessário apenas se você incluir o PayFace provedor de liveness (
caffaceliveness-providers-payface).
Exemplo de configuração:
Mais detalhes
Flexibilidade: essa configuração permite que o projeto baixe todas as dependências necessárias de diferentes fontes, garantindo compatibilidade e versões atualizadas.
Manutenção: se houver atualizações nos repositórios ou mudanças na estrutura de publicação, basta atualizar esta seção para refletir as novas URLs.
Contexto: a inclusão de repositórios é feita apenas uma vez no nível do projeto, garantindo que todos os módulos possam acessar os artefatos necessários.
Passo 2 - Inclua a dependência do CafSDK
Depois de configurar os repositórios, é necessário declarar as dependências específicas do CafSDK no arquivo build.gradle.kts do módulo do seu aplicativo. Esta etapa declara quais módulos do SDK serão usados, permitindo que o Gradle gerencie as versões e resolva as dependências corretamente.
Exemplo de declaração de dependências:
iProov e Protobuf
Use
caffaceliveness-providers-iproov-litequando seu app padroniza em Protobuf JavaLite (padrão típico para menor footprint).Use
caffaceliveness-providers-iproov-fullquando você precisa usar Protobuf Java (completo) junto com iProov.
Você pode combinar vários provedores no mesmo app declarando mais de uma caffaceliveness-providers-* dependência, se sua integração exigir.
Se seu projeto usa o provedor Payface (caffaceliveness-providers-payface), você deve usar a versão lite do iProov: implementation("io.caf.sdk:caffaceliveness-providers-iproov-lite") Isso ocorre porque o Payface é construído usando Protobuf JavaLite. Misturá-lo com a versão "full" do iProov causará conflitos de dependência durante o processo de compilação.
Importante
Caf BoM (Lista de Materiais)
Usar o BoM ajuda a centralizar o gerenciamento de versão de todos os módulos do CafSDK. Assim, todas as dependências relacionadas ao SDK usarão a mesma versão definida, evitando conflitos e facilitando as atualizações.
Módulos de Captura
Caf Face Liveness: sempre declare
caffaceliveness(base compartilhada) e pelo menos umcaffaceliveness-providers-*módulo para os provedores usados pela sua integração.caffacelivenesse uma dependência de provedor são ambas obrigatórias; a base não inclui SDKs de fornecedores por padrão.caffaceliveness-uiis opcional: ele adiciona a UI de Face Liveness do Caf e customização hooks; omita-o para um fluxo totalmente personalizado ou sem interface.Caf Document Detector: escolha o módulo padrão ou o com a UI do Caf (
document-detector-ui), de acordo com suas necessidades de UX.
Problemas conhecidos
Conflitos de Classes Duplicadas com TensorFlow Lite ou LiteRT
Se seu aplicativo usa outros SDKs que incluem dependências do TensorFlow Lite ou LiteRT (como ML Kit, Firebase ML ou outros SDKs baseados em ML), você pode encontrar classe duplicada erros durante a compilação.
Solução:
Exclua as dependências conflitantes do módulo Document Detector adicionando a seguinte configuração ao seu build.gradle.kts:
Observação: Essa solução é recomendada quando você está usando outros SDKs que já fornecem essas dependências em seu projeto.
Verificação de Versão
Verifique sempre a versão mais recente do CafSDK nas notas de versão para garantir que você esteja usando as versões mais atualizadas e compatíveis.
Versões Atuais dos Módulos
A seguir estão as versões atuais dos módulos independentes:
CafSDK
7.10.0
Módulo de validação unificada
Essa configuração garante que seu projeto esteja preparado para integrar o CafSDK, assegurando que todos os artefatos necessários sejam localizados e incorporados durante a compilação. Se houver mudanças nos repositórios ou novas dependências forem introduzidas, atualize as configurações.
Como inicializar o SDK
Permissões
Para que os módulos funcionem corretamente, algumas permissões precisam ser declaradas no AndroidManifest.xml arquivo, confira:
Para Face Liveness
android.permission.CAMERA
Permite acesso à câmera para capturar imagens e realizar a verificação facial (liveness).
Obrigatório
android.permission.INTERNET
Permite a comunicação com serviços de autenticação e verificação (HTTPS/WSS).
Obrigatório
Para Document Detector
android.permission.CAMERA
Permite acesso à câmera para capturar imagens de documentos.
Somente para captura
android.permission.INTERNET
Permite que as imagens capturadas sejam enviadas aos servidores para processamento e validação.
Obrigatório
android.permission.READ_EXTERNAL_STORAGE
Permite acesso a arquivos e imagens armazenados para processamento, se necessário.
Somente para envio
Configurações
É necessário configurar o SDK para que ele entenda o fluxo de execução e os parâmetros específicos de cada módulo. O processo de inicialização é dividido em duas partes: configuração global e configuração específica do módulo.
Configuração global
Nesta etapa, você cria um objeto do tipo CafSdkConfiguration, que serve como contêiner central para todas as configurações do fluxo de captura.
Ordem de apresentação dos módulos (presentationOrder):
Defina a sequência na qual os módulos serão executados. Essa ordem é crucial para garantir que o fluxo de captura siga a lógica de negócio definida pelo seu projeto.
Por exemplo, se o fluxo exigir que o documento seja capturado antes da verificação de liveness, a ordem deve colocar o Detector de Documentos módulo antes do Face Liveness.
Importante: dependendo da implementação, pode haver variações nos nomes, como
CafModuleType.FACE_LIVENESSouCafModuleType.FACE_LIVENESS_UI, que indicam se será usada uma versão sem interface ou uma versão com interface.
Módulo de segurança (enableSecurityModule):
Ativa ou desativa o módulo de segurança. Opcional, o padrão é
true.
Exemplo de código para criar a configuração global:
Configuração específica do módulo
Depois de definir as configurações globais, é necessário configurar os módulos individualmente. Essa configuração específica permite ajustar parâmetros operacionais específicos, garantindo que eles se comportem de acordo com os requisitos do seu fluxo de captura.
Configuração do Document Detector
O Módulo Document Detector é responsável pela captura e processamento de documentos. Sua configuração envolve vários parâmetros.
Parâmetro obrigatório:
Fluxo de captura (flow):
Define uma lista de etapas (
DocumentDetectorStep) que especifica qual documento será capturado.Esse fluxo pode ser personalizado de acordo com os tipos de documentos a serem validados pelo aplicativo.
Parâmetros operacionais:
useAdb,useDebugeuseDeveloperModesão flags que ativam modos específicos para testes e desenvolvimento, permitindo maior flexibilidade durante a fase de integração.manualCaptureEnabledemanualCaptureTimecontrolam se a captura manual é permitida e, se for, definem o limite de tempo (em segundos) para o usuário executar a ação manualmente.requestTimeoutdefine o tempo máximo (em segundos) que o sistema aguardará por uma resposta do servidor.showPopupdetermina se um pop-up de confirmação ou instrução será exibido ao usuário após a captura do documento.
Exemplo de código para a configuração do Document Detector:
Configuração do Face Liveness
A configuração do módulo Face Liveness é essencial para garantir a segurança e a confiabilidade do processo de verificação facial, pois ele tem a função de validar se o rosto capturado pertence a uma pessoa real. Os principais parâmetros são:
Carregamento (Tela de carregamento):
O
loadingflag define se uma tela de carregamento deve ser exibida enquanto o módulo executa o processamento. Isso melhora a experiência do usuário ao informá-lo de que o processo está em andamento.
Configuração de Proxy Reverso
authBaseUrlelivenessBaseUrlsão endpoints opcionais para os serviços de autenticação e verificação de liveness, respectivamente.Uma vez configurados, esses valores devem ser definidos com URLs válidas, em que
authBaseUrlnormalmente usa o protocolo HTTPS por segurança, elivenessBaseUrlusa WSS (WebSocket Seguro).Certificados:
Ao atribuir valores às URLs dos serviços, também é necessário fornecer a
certificateslista e garantir comunicações seguras com servidores confiáveis (ao usar proxy reverso).
Opções Adicionais:
screenCaptureEnabledhabilita ou desabilita a capacidade de capturar a tela durante o processo de verificação.debugModeEnabledpermite que logs e informações adicionais fiquem disponíveis durante a execução, facilitando a depuração.executeFaceAuthdefine se a autenticação facial será executada.maxRetryAttemptsdefine o número máximo de tentativas de retentativa para a validação de liveness facial. Se definido como -1, permite retentativas ilimitadas.
Exemplo de código para a configuração do Face Liveness:
Essas configurações iniciais são fundamentais para garantir que o SDK funcione como esperado. Cada parâmetro foi projetado para oferecer flexibilidade e segurança, permitindo que o fluxo de captura seja adaptado às necessidades específicas do seu aplicativo.
Ao concluir essas configurações, o SDK estará pronto para ser inicializado e executado, garantindo uma integração robusta e eficiente com os módulos.
Inicializando o Builder
A inicialização do Builder é a etapa em que o fluxo de captura do CafSDK é configurado para execução. Usando a classe CafSdkProvider.Builder, você configura os parâmetros essenciais que definem o comportamento do fluxo e preparam o SDK para ser iniciado.
Parâmetros essenciais
mobileToken: token que autentica a requisição e garante que apenas clientes autorizados iniciem o fluxo.
personId: identificador único do usuário para o qual o fluxo será executado.
environment: define o ambiente de execução, por exemplo, CafEnvironment.PROD para produção. Isso permite alternar entre os ambientes de desenvolvimento, homologação e produção.
configuração: o objeto CafSdkConfiguration configurado anteriormente, que contém tanto a ordem de execução dos módulos quanto as configurações específicas.
callback: um callback unificado, onde todos os eventos gerados pelos módulos (como carregamento, sucesso, erro e cancelamento) são tratados centralmente.
Exemplo de código detalhado:
Callback Unificado
O callback unificado é um dos pilares do CafSDK, responsável por notificar o aplicativo sobre o estado de cada etapa do fluxo de captura. Ele centraliza os eventos disparados pelos módulos e permite ao desenvolvedor implementar lógicas de resposta, registros de logs e tratamento de erros.
Tipos de eventos do callback:
Log: captura mensagens de log com diferentes níveis (DEBUG, USAGE, INFO). Essas mensagens ajudam a identificar o comportamento interno do fluxo.
Carregando: indica o início do processamento do módulo. Útil para exibir indicadores visuais de progresso.
Carregado: confirma que determinada ação foi executada. Útil para ocultar indicadores visuais de progresso.
Sucesso: ao concluir com sucesso, cada módulo dispara um evento contendo um CafUnifiedResponse objeto.
Falha: se ocorrer uma falha durante a execução, este evento é disparado com uma mensagem descritiva e o tipo da falha.
Erro: se ocorrer um problema durante a execução, este evento é disparado com a mensagem de erro, permitindo que o aplicativo trate o erro.
Cancelado: indica que o usuário ou o sistema interrompeu o fluxo, permitindo ações de recuperação ou notificações.
Exemplos de código:
Tratamento de eventos da sessão
O callback do builder retorna um conjunto de eventos definido pela CafUnifiedEvent enumeração. Esses eventos incluem:
Loading: indica uma solicitação de carregamento do SDKLoaded: indica uma solicitação de carregamento do SDK concluídaSuccess(responses: List<CafUnifiedResponse>): resultados finais (quandowaitForAllServices=true)Failure(response: String, type: CafFailureType, description: String): falhas específicas do móduloError(response: String, type: CafErrorType, description: String): erros críticos de execuçãoCancelado: cancelamento iniciado pelo usuárioLog(level: CafLogLevel, message: String): informações de depuração
Detalhamento dos tipos de erro
Tipos de Falha (CafFailureType)
UNKNOWN
Falha genérica
✅
❌
TOO_MUCH_MOVEMENT
Movimento excessivo da cabeça
✅
❌
TOO_BRIGHT
Iluminação excessiva
✅
❌
TOO_DARK
Condições de pouca luz
✅
❌
MISALIGNED_FACE
Falha no alinhamento do rosto
✅
❌
FACE_TOO_FAR
Rosto muito distante
✅
❌
FACE_TOO_CLOSE
Rosto muito perto
✅
❌
SUNGLASSES
Óculos que obstruem os olhos
✅
❌
OBSCURED_FACE
Obstrução parcial do rosto
✅
✅
EYES_CLOSED
Olhos fechados durante a captura
✅
✅
MULTIPLE_FACES
Vários rostos detectados
✅️
✅️
BACKGROUND_ISSUE
Fundo inadequado
❌
✅
DEVICE_ISSUE
Dispositivo incompatível
❌
✅
EYEWEAR
Óculos detectados
❌
✅
FACE_NOT_FOUND
Falha na detecção do rosto
❌
✅
FRAMES_BLURRY
Quadros borrados detectados
❌
✅
MOTION_ISSUE
Erro de movimento do dispositivo
❌
✅
LIGHTING_ISSUES
Condições de iluminação ruim
❌
✅
REJECTED
Transação rejeitada
❌
✅
SYSTEM_ERROR
Erro interno do sistema
❌
✅
TIMEOUT
Tempo da sessão esgotado
❌
✅
USER_NOT_FOUND
Falha na busca do usuário
❌
✅
DEVICE_RESTART
Erro de estado do dispositivo
❌
✅
PROCESSING_FAULT
Erro de processamento
❌
✅
Legenda: ✅ = compatível, ❌ = não compatível
Tipos de Erro (CafErrorType)
GENERIC_ERROR
Ocorre um erro genérico
UNKNOWN
Erro não classificado
SEQUENCE_INVALID
Quando a lista de sequência na execução do CafSDK está vazia
CAMERA_PERMISSION
Acesso à câmera negado
NETWORK_EXCEPTION
Problemas de conectividade de rede
SERVER_EXCEPTION
Falha no processamento do backend
TOKEN_EXCEPTION
Token inválido/expirado
LIVENESS_EXCEPTION
Quando ocorre um problema de liveness
UNSUPPORTED_DEVICE
Especificações do dispositivo não suportadas
FINGERPRINT_EXCEPTION
Quando a impressão digital de um dispositivo apresenta um problema
CANCELLATION
Quando o usuário cancelar a execução
LIBRARY_EXCEPTION
Erro de baixo nível do framework
STORAGE_EXCEPTION
Não há espaço no armazenamento interno do dispositivo do usuário
PERMISSION_EXCEPTION
Permissões do sistema ausentes
PROXY_EXCEPTION
Quando ocorre um problema ao usar o proxy configurado
SECURITY_EXCEPTION
Quando o SDK não pode ser iniciado por um motivo de segurança
AVAILABILITY_EXCEPTION
O SDK ainda não está disponível para uso.
INVALID_EXCEPTION
Quando o token é inválido
FACE_AUTHENTICATION
Quando ocorre um problema de autenticação facial
Retornos de segurança
Estamos constantemente tomando ações para tornar o produto mais seguro, mitigando muitos ataques observados nos processos de captura e reduzindo o máximo possível as tentativas de fraude de identidade. Os erros descritos aqui são retornados no message campo da SecurityReason classe.
Desativando as verificações de segurança
Erros 300–400: Você pode desativar essas verificações individualmente por meio dos métodos por verificação do SDK Builder (por exemplo,
.setUseDeveloperMode(bool use)para 300,.setUseAdb(bool use)para 400). Nenhuma alteração no módulo de segurança global é necessária.Erros 500–699: Essas verificações são aplicadas dentro do módulo de segurança. Para desativá-las, você deve definir
enableSecurityModule = falseemCafSdkConfiguration. Quando existir um método por verificação no builder, use-o também:.setUseDebug(bool use)para 500,.checkAppSignature(use: Boolean)para 600. Para 601, 602 e 699 não há método por verificação; desativar o módulo de segurança viaenableSecurityModule = falseé necessário.
Error 300
Representa o bloqueio de dispositivos com o modo desenvolvedor ativo.
O modo desenvolvedor permite que os usuários acessem configurações avançadas, como depurar apps via USB. Por padrão, os SDKs bloqueiam dispositivos em modo desenvolvedor.
Para desativar essa validação, use o .setUseDeveloperMode(bool use) método no SDK Builder.
Error 400
Representa o bloqueio de dispositivos com Android Debug Bridge (ADB) ativado.
O ADB permite que os usuários instalem e depurem apps e acessem um shell Unix. Por padrão, os SDKs bloqueiam dispositivos com ADB ativado.
Para desativar essa validação, use o .setUseAdb(bool use) método no SDK Builder.
Error 500
Representa o bloqueio de dispositivos com o modo de depuração ativado.
O modo de depuração permite que os usuários depurem aplicativos via USB, permitindo contornar os fluxos do SDK. Por padrão, os SDKs bloqueiam dispositivos em modo de depuração.
Para desativar essa validação, use o .setUseDebug(bool use) método no SDK Builder e defina enableSecurityModule = false em CafSdkConfiguration.
Erro 600
Representa o bloqueio de dispositivos com assinaturas de app fraudulentas ou ferramentas de adulteração detectadas.
A verificação de assinatura bloqueia ataques de engenharia reversa e todos os outros ataques maliciosos que podem ser feitos após esse processo, no qual a assinatura original do app é alterada. Por isso, os SDKs realizam esse bloqueio por padrão.
Se você quiser desativar essa validação, use o .checkAppSignature(use: Boolean) método no SDK Builder e defina enableSecurityModule = false em CafSdkConfiguration.
Erro 601
Representa o bloqueio de dispositivos com root ou com frameworks de gerenciamento de root.
O acesso root contorna a sandbox de segurança do Android e permite controle total do dispositivo e do ambiente do aplicativo.
Para desativar essa validação, defina enableSecurityModule = false em CafSdkConfiguration.
Erro 602
Representa um erro de validação de segurança.
Retornado quando o processo de validação de segurança falha inesperadamente ou um detector de segurança falha ao ser executado.
Para evitar esse erro no desenvolvimento ou se os detectores estiverem falhando, desative o módulo de segurança em CafSdkConfiguration com enableSecurityModule = false.
Erro 699
Representa um erro de segurança desconhecido ou não catalogado.
Este código é usado quando o módulo de segurança detecta uma condição que não corresponde a nenhuma das categorias definidas (500, 600, 601, 602).
Para evitar esse erro no desenvolvimento, você pode desativar o módulo de segurança em CafSdkConfiguration com enableSecurityModule = false.
Pré-carregamento da sessão (opcional)
O loadSession() método permite pré-carregar a sessão do usuário antes de iniciar o fluxo do SDK. Isso melhora o tempo de abertura do SDK de Face Liveness ao preparar a sessão e a inicialização da câmera com antecedência, resultando em uma inicialização mais rápida do SDK quando start() é chamado.
Quando usar:
Quando você deseja otimizar a experiência do usuário reduzindo o tempo de carregamento inicial
Quando você tem a oportunidade de pré-carregar a sessão antes que o usuário realmente precise iniciar o fluxo
Particularmente útil para a inicialização do módulo Face Liveness
Exemplo de código:
Observações importantes:
Este método é opcional e pode ser chamado após
build()mas antes destart()O parâmetro context deve ser um contexto de aplicação válido
Pré-carregar a sessão ajuda a reduzir o tempo de carregamento inicial quando
start()for finalmente chamadoIsso é particularmente benéfico para a inicialização do módulo Face Liveness
Início do fluxo configurado
Depois de construir o sdkBuilder objeto com todas as configurações e o callback definidos, o fluxo de captura é iniciado chamando o start() método. Esse método recebe o contexto (o contexto da aplicação é recomendado) e inicia a execução sequencial dos módulos configurados.
Código para iniciar o fluxo:
Detalhes do processo
Contexto: o parâmetro passado para
start()deve ser um contexto válido (por exemplo, o atualaplicativoinstância), permitindo que o SDK exiba as telas de captura e gerencie as transições da interface.Execução sequencial: o SDK inicia os módulos na ordem definida em
presentationOrder. Cada módulo é executado sequencialmente e, ao ser concluído, aciona o próximo, garantindo que o fluxo siga a lógica estabelecida.Integração do callback: durante a execução, o SDK usa o callback unificado para enviar os eventos correspondentes (loading, loaded, success etc.), permitindo que a aplicação reaja em tempo real de acordo com o estado do fluxo.
Concluir uma sessão
A conclusão de uma sessão no CafSDK ocorre quando todos os módulos configurados foram executados ou quando ocorre um erro/cancelamento no fluxo.
Definição de sessão concluída
Execução completa: a sessão é considerada concluída quando cada módulo no fluxo de captura aciona um
Sucessoevento, indicando que todas as operações foram realizadas com sucesso.Interrupção do fluxo: se ocorrer um erro ou se o usuário cancelar o processo em qualquer momento, a sessão é interrompida, e o
ErrorouCanceladoevento é acionado, permitindo que a aplicação tome as medidas necessárias.
Eventos de conclusão
Sucesso:
Retorna os resultados após a conclusão de todos os módulos quando
waitForAllServicesestá ativado; caso contrário, cada módulo que termina com sucesso envia umCafUnifiedEvent.Successevento, que inclui:moduleName:identifica o módulo que concluiu a operação (por exemplo,"documentDetector"ou"faceLiveness").signedResponse:um token JWT contendo os dados de resultado obtidos pela execução do módulo. Esses dados podem incluir informações relevantes para o processo, como imagens capturadas ou resultados de validação.
Falha:
Se um módulo falhar ao concluir sua operação, ele aciona um
CafUnifiedEvent.Failureevento, que inclui:response:um token JWT contendo os dados de resultado obtidos pela execução do módulo. Esses dados podem incluir informações relevantes para o processo, como imagens capturadas ou resultados de validação.type:o tipo de falha.description:uma mensagem descritiva explicando a falha, permitindo o tratamento adequado do erro ou notificações ao usuário.
Erro:
Se o fluxo for interrompido devido a uma falha ou cancelamento:
Erro: a
CafUnifiedEvent.Errorevento é acionado com uma mensagem descritiva do problema, permitindo a implementação de lógica de recuperação ou notificações ao usuário.response:um token JWT contendo os dados de resultado obtidos pela execução do módulo. Esses dados podem incluir informações relevantes para o processo, como imagens capturadas ou resultados de validação.type:o tipo de erro.description:uma mensagem descritiva explicando a falha, permitindo o tratamento adequado do erro ou notificações ao usuário.
Cancelado:
Se o processo for cancelado (por exemplo, pelo usuário), o
CafUnifiedEvent.Cancelledevento é acionado, permitindo a limpeza de recursos ou a exibição de mensagens informativas.
Essas etapas garantem que você tenha uma visão completa e técnica do processo de inicialização e conclusão do fluxo do CafSDK, permitindo uma integração simplificada e a implementação de estratégias adequadas para lidar com cada etapa do fluxo de captura.
Essas etapas garantem que você tenha uma visão completa e técnica do processo de inicialização e conclusão do fluxo do CafSDK, permitindo uma integração simplificada e a implementação de estratégias adequadas para lidar com cada etapa do fluxo de captura.
Personalização avançada do fluxo
Saiba como personalizar e ajustar o fluxo de captura do CafSDK para atender a requisitos específicos de negócios e experiência do usuário.
Ordem de execução
A ordem em que os módulos serão executados é definida no
presentationOrdercampo daCafSdkConfigurationobjeto.Essa sequência é fundamental, pois impacta diretamente a lógica do fluxo. Por exemplo, se o processo exigir que o documento seja capturado antes da verificação facial, a ordem deve refletir essa prioridade.
Configuração específica
Para personalizar os módulos individualmente, use o setDocumentDetectorConfig e setFaceLivenessConfig métodos. Eles permitem ajustar parâmetros críticos, como:
Tempo de captura: define o tempo limite para o usuário realizar a captura manual.
Tempo limite: estabelece o limite máximo de espera por uma resposta do serviço.
Flags de depuração: ativam ou desativam modos de depuração para facilitar a identificação de problemas durante o desenvolvimento.
Layout e outros parâmetros: permitem configurar elementos visuais e operacionais específicos de cada módulo.
Personalização visual
Com o CafColorConfiguration objeto, é possível alinhar a identidade visual do fluxo de captura com a marca do seu aplicativo. Essa personalização garante que os elementos visuais (botões, fundos e indicadores) mantenham consistência com o design do aplicativo.
Registro e monitoramento
O callback unificado implementa diferentes níveis de log (DEBUG, USAGE, INFO), o que permite uma visão detalhada de cada etapa do fluxo. Esses logs são essenciais para integração com ferramentas de monitoramento, ajuste de desempenho ou identificação de problemas em tempo real.
Exemplo de implementação
Configuração de Face Liveness
A integração do Caf Face Liveness (FL) módulo é feita por meio de sua configuração no CafSdkConfiguration objeto. Uma vez definido, o fluxo executa automaticamente o módulo na posição correspondente definida na ordem de apresentação.
A configuração de Face Liveness é feita por meio do CafFaceLivenessConfig objeto, no qual são informados os parâmetros que o SDK usará durante sua execução. Confira os principais métodos de configuração disponíveis:
setLoading
Boolean
Ativa ou desativa a tela de carregamento. O padrão é: false.
setAuthBaseUrl
String
Define uma URL do proxy Define uma URL do proxy reverso para autenticação. Deve usar o protocolo HTTPS. Opcional. Obrigatório apenas para proxy reverso.
setLivenessBaseUrl
String
Define uma URL de proxy reverso para verificação de Face Liveness. Deve usar o protocolo WSS. Opcional. Obrigatório apenas para proxy reverso.
setCertificates
List
Define os certificados codificados em Base64 (SHA-256) para o proxy reverso. Opcional. Obrigatório apenas para WSS via proxy.
setScreenCaptureEnabled
Boolean
Ativa ou desativa a captura de tela. O padrão é: false.
setDebugModeEnabled
Boolean
Ativa ou desativa a geração de logs para ajudar na depuração durante a integração. O padrão éfalse.
setSdkType
CafFaceLivenessPlatform
Informa qual plataforma está executando o SDK. O padrão é CafFaceLivenessPlatform.NATIVE_ANDROID.
setExecuteFaceAuth
Boolean
Define se a autenticação facial será executada.
Exemplo de configuração para Face Liveness:
Resultados
Após a execução bem-sucedida, um CafUnifiedEvent.Success evento é acionado, que contém:
moduleName: o nome identificador do módulo (por exemplo, "faceLiveness").
signedResponse: um token JWT com os dados de verificação.
Em seguida, esses dados são processados pelo callback unificado, permitindo atualizar a interface do usuário ou continuar o fluxo conforme necessário.
Configurações personalizadas - Face Liveness
Use configurações personalizadas para direcionar as solicitações por meio de proxies seguros e garantir que os protocolos corretos (WSS para Face Liveness e HTTPS para autenticação) sejam usados.
Configuração de proxy reverso (opcional)
Essa configuração avançada permite direcionar conexões do módulo Face Liveness por meio de um proxy reverso, usando o protocolo WSS (Web Socket Secure). Siga os passos para configurar corretamente:
URL do proxy: defina seu proxy para se comunicar com o endpoint desejado. Por exemplo, você pode usar:
wss://us.rp.secure.iproov.me/wsou outra URL compatível.Configuração da URL de Face Liveness: use o
.setLivenessBaseUrlmétodo para configurar a URL de Face Liveness. Lembre-se de que o protocolo deve ser WSS.Definição de certificado: use o
.setCertificatesmétodo para definir os certificados necessários. Esses certificados devem ser os hashes SHA-256 dos certificados do proxy codificados em Base64.
Exemplo de código:
Proxy reverso para autenticação (opcional)
Para a comunicação de autenticação, é necessário configurar o proxy reverso com uma URL HTTPS. Essa configuração direciona as solicitações de autenticação para o ambiente apropriado.
URL do proxy: defina seu proxy para se comunicar. Por exemplo, você pode usar:
https://api.public.caf.io/.Configuração da URL de autenticação: use o
.setAuthBaseUrlmétodo para especificar a URL de autenticação, garantindo que o protocolo HTTPS seja usado.
Exemplo de código:
Observação: na prática, ambas as configurações (para autenticação e Face Liveness) podem ser combinadas em uma única instância de
CafFaceLivenessConfig.
Estruturas de configuração
Ao usar o módulo de UI (com o -ui sufixo), você estará usando as telas proprietárias do Caf, que oferecem algumas possibilidades de personalização. Confira os detalhes:
Tela de instruções do Caf Face Liveness
Essa estrutura permite personalizar a tela de instruções do Face Liveness.
imagem
String?
Imagem exibida no cabeçalho da tela. O valor pode ser uma URL, o ID do recurso (em formato de string) ou o nome do recurso presente na pasta drawable.
null
título
String?
Título da tela (por exemplo, "Instruções para escanear o rosto").
null
descrição
String?
Texto descritivo breve (por exemplo, "Siga as etapas abaixo").
null
steps
List<String>?
Lista ordenada de instruções (por exemplo, listOf("Mantenha o telefone parado"; "Boa iluminação")).
null
buttonText
String?
Texto do botão de confirmação (por exemplo, "Iniciar escaneamento").
null
Configuração de cores do Caf
Essa estrutura permite personalizar as cores globais de todas as interfaces. As cores seguem o padrão RGB ou ARGB.
primaryColor
String
Cor principal para botões e destaques.
Código hexadecimal (por exemplo, #FF0000)
secondaryColor
String
Cor secundária para elementos complementares.
Código hexadecimal
cor de fundo
String
Cor de fundo da tela.
Código hexadecimal
contentColor
String
Cor usada para textos e ícones.
Código hexadecimal
mediumColor
String
Cor neutra para elementos como barras de progresso.
Código hexadecimal
Exemplos de código
Confira o exemplo de como configurar o módulo Face Liveness com instruções, proxy reverso (para autenticação e verificação) e personalização da interface.
Mais informações
Requisitos dos certificados
Certificados: eles devem ser os hashes SHA-256 do SPKI (Subject Public Key Info) do certificado codificados em Base64.
Aplicação do protocolo
Face Liveness: A URL para Face Liveness deve use o
wss://ao usar um proxy reverso.Autenticação: A URL para autenticação deve use o
https://ao usar um proxy reverso.
Configuração do Document Detector
O módulo Caf Document Detector (DD) é configurado de forma semelhante ao Face Liveness, mas com foco na captura e no processamento de documentos.
Configuração e execução
Em CafSdkConfiguration, configure os parâmetros específicos do Document Detector, que determinam o comportamento de captura de documentos.
Parâmetros principais:
o fluxo: uma lista de etapas (DocumentDetectorStep) que define qual documento e quais ângulos ou partes devem ser capturados.useAdb,useDebugeuseDeveloperMode: flags que auxiliam no desenvolvimento e na execução em ambientes de teste.manualCaptureEnabledemanualCaptureTime: configuram se a captura manual é permitida e qual é o tempo limite da ação.requestTimeout: tempo máximo de espera por respostas do servidor ou ações do usuário.showPopup: determina se uma mensagem de confirmação ou instrução será apresentada ao usuário.maxRetryAttempts: define o número máximo de tentativas permitidas antes de interromper o processo ou exibir uma mensagem de erro ao usuário
Exemplo de configuração do Document Detector:
Resultados
Ao concluir a captura e o processamento do documento, o módulo Document Detector aciona um
CafUnifiedEvent.Successevento.Esse evento inclui o
moduleName(por exemplo,"documentDetector") e umresultadocontendo os dados capturados.O callback unificado pode então usar essas informações para prosseguir para a próxima etapa ou armazenar os resultados conforme necessário.
Configurações personalizadas - Document Detector
Para configurar o Caf Document Detector, use a CafDocumentDetectorConfig estrutura, que inclui:
Etapas do fluxo de captura de documentos.
Personalização do layout da interface do usuário (UI).
Mensagens de feedback.
Comportamento de upload.
Configurações de proxy.
Configuração principal
Propriedades de CafDocumentDetectorConfig.
layoutId
Int?
ID de layout personalizado.
as configurações de upload
UploadSettings?
Configurações para upload de documentos. Veja UploadSettings
manualCaptureEnabled
Boolean?
Ativa ou desativa a captura manual.
manualCaptureTime
Int?
Tempo limite para captura manual (em segundos).
requestTimeout
Int?
Tempo limite para solicitações (em segundos).
showPopup
Boolean?
Ativa ou desativa pop-ups antes da captura.
previewShow
Boolean?
Ativa ou desativa a pré-visualização da imagem capturada.
instructionsEnabled
Bool
Ativa a tela de pré-visualização de instruções.
ddCustomizations
List<CafDDCustomization>?
Lista de personalizações de strings de UI e ativos para as telas do Document Detector (por exemplo, pop-up de upload, tela de pré-visualização).
getUrlExpireTime
String?
Define por quanto tempo a URL da imagem permanecerá ativa no servidor até expirar. Aceita intervalos como 30m (minutos), 24h (horas) ou 10d (dias).
allowedPassportCountryList
List<CountryCodesList>?
Lista de países permitidos para passaportes. Veja CountryCodesList
useDebug
Boolean?
Permite que o app seja executado em modo de depuração quando true. Não recomendado para produção
useDeveloperMode
Boolean?
Ativa o modo de desenvolvedor quando true. Não recomendado para produção
useAdb
Boolean?
Ativa o modo de depuração do Android Debug Bridge (ADB) quando true. Não recomendado para produção
DocumentDetectorStep
Para criar um fluxo de captura, você deve criar um array de DocumentDetectorStep, em que cada elemento representa uma etapa de captura. Para construir cada DocumentDetectorStep objeto, você pode usar o seguinte:
Construtor
document
Documento
Tipo de documento a ser capturado (por exemplo, .rgFront).
Sim
stringStepLabel
String?
Texto exibido na parte inferior da tela para esta etapa.
Não
Rótulo padrão do documento
stringIllustration
String?
Imagem exibida no pop-up de instrução para esta etapa.
Não
Ilustração padrão do documento
stringMessage
String?
Texto de mensagem personalizado para o pop-up de instruções desta etapa.
Não
Mensagem padrão do documento
okButtonTitle
String?
Texto personalizado para o botão "OK" no pop-up de instruções desta etapa.
Não
"OK"
document: Document
Especifica o documento a ser capturado na etapa. Veja os tipos suportados abaixo.
setStepLabel(stepLabel: Int)
Define o texto exibido na parte inferior do layout.
setIllustration(illustration: Int)
Define a ilustração exibida no pop-up antes da captura.
showStepLabel(showStepLabel: Boolean)
Alterna a visibilidade do texto na parte superior do layout.
Documentos suportados
RG_FRENTE
Lado frontal do documento RG, onde a foto está localizada.
RG_VERSO
Lado de trás do documento RG.
RG_COMPLETO
Documento RG aberto, exibindo juntos os lados frontal e traseiro.
CNH_FRENTE
Lado frontal do documento CNH, onde a foto está localizada.
CNH_VERSO
Lado de trás do documento CNH.
CNH_COMPLETO
Documento CNH aberto, exibindo juntos os lados frontal e traseiro.
CRLV
Documento CRLV.
RNE_FRENTE
Lado frontal do documento RNE ou RNM.
RNE_VERSO
Lado de trás do documento RNE ou RNM.
PASSAPORTE
Documento de passaporte, exibindo a foto e os dados pessoais.
CTPS_FRENTE
Lado frontal do documento CTPS, onde a foto está localizada.
CTPS_VERSO
Lado de trás do documento CTPS.
QUALQUER
Permite o envio de qualquer tipo de documento, incluindo todos os listados acima ou qualquer outro documento não classificado.
Exemplo:
UploadSettings
Configura as definições relacionadas ao upload de documentos.
.setEnable(enable: Boolean)
Ativa ou desativa este recurso.
.setCompress(enable: Boolean)
Ativa ou desativa a compressão do arquivo antes do upload.
.setFileFormats(fileFormats: Array<FileFormat>)
Especifica os formatos de arquivo aceitos para upload.
.setMaxFileSize(maxFileSize: Int)
Define o limite máximo de tamanho do arquivo em KB.
.setActivityLayout(activityLayout: Int)
Define o layout de fundo para upload de documentos.
.setPopUpLayout(popUpLayout: Int)
Define o layout do pop-up para a solicitação de upload do documento.
Atualmente, os formatos de arquivo suportados são:
PNG
image/png
JPG
image/jpg
JPEG
image/jpeg
PDF
application/pdf
HEIF
image/heif
ProxySettings
Para que o SDK use um proxy ao fazer solicitações, você deve configurar uma instância do ProxySettings classe.
Método Construtor
hostname
String
Define o domínio ou endereço IP do serviço de proxy.
port
String
Define a porta a ser usada.
Métodos opcionais
setAuthentication(String user, String password)
Define os parâmetros de autenticação do proxy, se necessário.
user
Nome de usuário a ser usado para autenticação.
password
Senha a ser usada para autenticação.
setProxyCertificate(@RawRes Integer proxyCertificate)
Se o servidor proxy usar um certificado SSL autoassinado ou um emitido por uma Autoridade Certificadora (CA) não pública, adicione o certificado da CA em PEM ou DER formato para o res/raw/ diretório (por exemplo, res/raw/proxy_certificate) e passar o identificador do arquivo como argumento (por exemplo, R.raw.proxy_certificate).
proxyCertificate
ID do arquivo do certificado do proxy.
setMTLSConfig(@RawRes Integer clientCertificate, String password)
Se o seu servidor proxy oferecer suporte a mTLS, salve o certificado do cliente em PKCS12 formato (.p12) para o res/raw/ diretório (por exemplo, res/raw/client_certificate) e passe o identificador do arquivo (por exemplo, R.raw.client_certificate) e a chave privada como argumentos.
clientCertificate
ID do arquivo de certificado do cliente.
password
Chave privada a ser usada.
Personalização de strings e ativos da UI (CafDDCustomization)
O ddCustomizations propriedade em CafDocumentDetectorConfig permite que você forneça um array de objetos em conformidade com CafDDCustomization para substituir textos e imagens padrão em telas específicas do Document Detector.
CafPreviewCustomization
Personaliza a tela de pré-visualização do documento exibida após a captura de uma imagem do documento (se previewShow is true).
título
String?
Texto do título na tela de pré-visualização.
"A foto está boa?"
message
String?
Texto do subtítulo/mensagem na tela de pré-visualização.
"Verifique se todas as informações estão legíveis..."
okButton
String?
Texto para o botão de confirmação ("aceitar").
"Sim, está boa!"
tryAgainButton
String?
Texto para o botão de tentar novamente ("tirar de novo").
"Tirar novamente"
Exemplo:
CafDDUploadCustomization
Personaliza o pop-up exibido quando o usuário escolhe enviar um arquivo de documento.
imagem
String?
Imagem exibida no topo do popup.
Ilustração padrão do SDK
message
String?
Texto da mensagem dentro do popup de envio.
"Selecione o arquivo..."
uploadButton
String?
Texto para o botão "Enviar".
"Enviar"
cancelButton
String?
Texto para o botão "Cancelar".
"Cancelar"
Exemplo:
CafMessageCustomization
Personaliza várias mensagens exibidas durante o processo de captura de documentos (por exemplo, mensagens do sensor, feedback da IA).
waitMessage
Mensagem exibida ao iniciar a câmera.
fitTheDocumentMessage
Mensagem que solicita ao usuário que ajuste o documento dentro do enquadramento.
holdItMessage
Mensagem exibida durante o processo de captura.
verifyingQualityMessage
Mensagem exibida durante a solicitação de verificação de qualidade.
lowQualityDocumentMessage
Mensagem exibida quando a captura do documento falha devido à baixa qualidade.
uploadingImageMessage
Mensagem exibida ao salvar a imagem capturada no servidor.
openDocumentWrongMessage
Mensagem exibida se um documento aberto for detectado.
unsupportedDocumentMessage
Mensagem para documentos não suportados.
documentNotFoundMessage
Mensagem exibida quando nenhum documento é detectado.
sensorLuminosityMessage
Mensagem exibida quando o nível de brilho está muito baixo.
sensorOrientationMessage
Mensagem exibida quando o limite de orientação não é atendido.
sensorStabilityMessage
Mensagem exibida quando o dispositivo não está estável o suficiente.
popupDocumentSubtitleMessage
Mensagem de subtítulo exibida no popup que apresenta a ilustração do documento.
positiveButtonMessage
Mensagem exibida no botão de confirmação.
aiScanDocumentMessage
Mensagem que solicita ao usuário que digitalize um documento.
aiGetCloserMessage
Mensagem que solicita ao usuário que se aproxime do documento.
aiCentralizeMessage
Mensagem que solicita ao usuário que centralize o documento na tela.
aiMoveAwayMessage
Mensagem que solicita ao usuário que se afaste do documento.
aiAlignMessage
Mensagem que solicita ao usuário que alinhe o documento.
aiTurnDocumentMessage
Mensagem que solicita ao usuário que gire o documento em 90 graus.
aiCapturedMessage
Mensagem que confirma que o documento foi capturado.
wrongDocumentMessage
Mensagem exibida quando o tipo de documento está incorreto.
Exemplo:
CountryCodesList
Lista completa dos códigos oficiais atualmente atribuídos de acordo com ISO 3166-1 alpha-3.
Personalização de telas
Ao usar o módulo de UI (com o -ui sufixo), você estará usando as telas proprietárias da CAF. Essas telas oferecem opções de personalização conforme descrito abaixo.
CafDocumentDetectorInstructionsScreen
Esta estrutura permite personalizar a tela de instruções.
imagem
String?
Imagem exibida no cabeçalho da tela. O valor pode ser uma URL, um ID de recurso (como string) ou o nome do recurso na pasta drawable.
título
String?
Título da tela (por exemplo, "Instruções para digitalizar o rosto").
descrição
String?
Texto descritivo breve (por exemplo, "Siga as etapas abaixo").
steps
List<String>?
Lista ordenada de instruções (por exemplo, listOf("Mantenha o telefone estável", "Garanta boa iluminação")).
buttonText
String?
Texto do botão de confirmação (por exemplo, "Iniciar digitalização").
CafDocumentDetectorDocumentSelectionScreen
Esta estrutura permite personalizar a tela de seleção de documentos.
documentos
List<CafDocument>
Lista de documentos a serem exibidos. O valor pode ser uma URL, um ID de recurso (como string) ou o nome do recurso na pasta drawable.
título
String?
Título da tela (por exemplo, "Selecionar o documento").
descrição
String?
Texto descritivo breve (por exemplo, "Escolha o documento que você deseja enviar").
groupLabels
CafDocumentGroupLabels?
Configura os itens da tela de seleção de documentos (título/descrição) com base nos grupos de documentos.
CafDocument
RGFront
Lado frontal do documento RG, onde fica a foto.
RGBack
Verso do documento RG.
RGFull
Documento RG aberto, exibindo as faces frontal e traseira juntas.
CnhFront
Lado frontal do documento CNH, onde fica a foto.
CnhBack
Verso do documento CNH.
CnhFull
Documento CNH aberto, exibindo as faces frontal e traseira juntas.
Crlv
Documento CRLV.
RneFront
Lado frontal do documento RNE ou RNM.
RneBack
Verso do documento RNE ou RNM.
Passaporte
Documento de passaporte, exibindo a foto e os dados pessoais.
CtpsFront
Lado frontal do documento CTPS, onde fica a foto.
CtpsBack
Verso do documento CTPS.
Outro
Permite o envio de qualquer outro tipo de documento que não seja classificado.
CafColorConfiguration
Esta estrutura permite personalizar as cores globais de todas as interfaces. As cores seguem o RGB ou ARGB padrão.
primaryColor
String
Cor primária para botões e destaques.
Código hexadecimal (por exemplo, #FF0000)
secondaryColor
String
Cor secundária para elementos complementares.
Código hexadecimal
cor de fundo
String
Cor de fundo da tela.
Código hexadecimal
contentColor
String
Cor usada para texto e ícones.
Código hexadecimal
mediumColor
String
Cor neutra para elementos como barras de progresso.
Código hexadecimal
dialogBackgroundColor
String
Cor de fundo de diálogos e pop-ups.
Código hexadecimal
dialogBorderColor
String
Cor da borda de diálogos e pop-ups.
Código hexadecimal
Exemplos de código
O exemplo a seguir demonstra como configurar o módulo DocumentDetector com instruções e personalização da interface:
CafUnifiedResponse
moduleName
String
Nome do módulo que emite o resultado no evento de sucesso.
signedResponse
String
JWT contendo os dados obtidos pela execução do módulo.
Recursos adicionais
Regras do ProGuard/R8
Confira o bloco de código com as regras de ProGuard/R8 necessárias para que o CafSDK e suas dependências funcionem corretamente mesmo após a ofuscação e otimização do código. Essas regras preservam informações essenciais (como assinaturas, anotações e classes internas) e evitam que classes críticas sejam removidas ou alteradas.
Suporte Técnico e Dicas de Uso
Suporte Técnico Se você tiver alguma dúvida ou dificuldade com a integração, entre em contato com o suporte técnico da Caf.
Dicas de uso
Execute testes: realize testes em dispositivos reais para validar os requisitos e o desempenho do fluxo.
Explore personalizações: use opções avançadas de personalização para adaptar o fluxo às necessidades do seu projeto.
Monitore o desempenho: integre ferramentas de monitoramento para acompanhar logs e o desempenho do fluxo em produção.
Atualizado

