Guia Detalhado de Uso

Aprofunde seu entendimento e personalize com precisão, com explicações completas que orientam cada etapa do processo.

📑 Sumário

  1. 📌 Visão Geral
  2. ✅ Requisitos de Compatibilidade
  3. ⚙️ Instalação
  4. 🚀 Inicialização do SDK
  5. 🔌 Gerenciamento de Provedores de Liveness
    5.1. 🧩 Provedor IProov
    5.2. 🧩 Provedor Facetec
    5.3. 🛠️FaceTec Versão 10 (Beta)
  6. 📦 Estrutura das Classes Importantes
  7. 🔍 Principais Classes e Métodos de Chamada
  8. 📱 Fluxo de Telas
    8.1. 📱 Telas CertiFace
    8.2. 📱 Telas IProov
    8.3. 📱 Telas Facetec
  9. 🔤 Customização das Fontes
    9.1. 🧩 IProov
    9.2. 🧩 Facetec
  10. 🧪 Ambiente de Testes
  11. 🛠️ Boas Práticas
  12. 📜 Changelogs e Versões
  13. 🔗 Links Externos

📌 Visão Geral

O CertifaceSDK é um SDK modular e extensível, responsável por oferecer verificação facial remota (Liveness Detection) via múltiplos provedores de biometria.

Sua arquitetura foi desenvolvida com foco em segurança, personalização e abstração de provedores, permitindo que novos fornecedores sejam incorporados no futuro com impacto mínimo na integração.

⚠️

Atualmente temos suporte aos provedores IProov e Facetec, mas em breve outros serão incorporados ao SDK.


✅ Requisitos de Compatibilidade

  • AndroidX: obrigatório
  • Jetpack Compose: obrigatório
  • Mínimo SDK: 26 (Android 8.0 – Oreo)
  • Linguagem base: Kotlin (compatível com Java)
  • Ambientes suportados:
    • HML: Homologação
    • PRD: Produção

⚙️ Instalação

settings.gradle:

dependencyResolutionManagement {
    maven { url "https://raw.githubusercontent.com/oititec/android-certiface-sdk-versions/main" }
}

build.gradle:

dependencies {
    implementation "br.com.certiface:certifacesdk:X.Y.Z"
}

🚀 Inicialização do SDK

Chame o método initialize() na inicialização da aplicação:

CertifaceSDK.initialize(
    context = applicationContext,
    config = SDKConfig(
        environment = Environment.HML, // ou Environment.PRD
        appKey = "SUA_APP_KEY"
    )
)

🔌 Gerenciamento de Provedores de Liveness

O CertifaceSDK utiliza o padrão de fábrica para criar instâncias específicas de cada provedor de Liveness:

val livenessManager = CertifaceSDK.createLivenessManager(
    provider = .LivenessProvider.IPROOV
)
ProvedorIdentificador EnumSuporte
IProovCertifaceSDK.LivenessProvider.IPROOV✅ Suporte Atual
FacetecCertifaceSDK.LivenessProvider.FACETEC✅ Suporte Atual
[Novo Provedor]em breve🔜 Planejado

🧩 Provedor: IProov

Este é o provedor atualmente integrado ao SDK. Ele oferece uma jornada de verificação baseada em luz e detecção passiva.

🎨 Personalização Visual

Personalize a interface usando IProovTheme:

Nota: Propriedades fora dos blocos configuram globalmente o iProov; dentro dos blocos são específicas de cada tela.

val demoTheme = IProovTheme.build {
    // Texto & Cores principais
    setTitle("Verificação Facial")              // título da tela
    setTitleColor("#FFFFFF")                    // cor do texto do título
    setHeaderBackgroundColor("#121212")         // cor do header
    setSurroundColor("#00FF00")                 // cor do contorno do oval
    setPromptTextColor("#FFFFFF")               // cor do texto do prompt
    setPromptBackgroundColor("#1F1F1F")         // cor de fundo do prompt

    // Comportamento 
    setTimeoutSecs(60)                          // timeout em segundos
    setIsEnabledScreenShots(true)               // habilita captura de tela
    setFilter(                                  // filtro de imagem do liveness
        FilterTheme.LineDrawing(
            style = LineDrawingStyle.SHADED,
            background = "#32a852".toColorInt(),
            foreground = "#4232a8".toColorInt()
        )
    )
    setCloseButton(br.com.oiti.designsystem.R.drawable.close_icon) // personalização do ícone do botão voltar
    setCloseButtonColor("#a8324a")             // personalização da cor do botão voltar

    // Orientação & Câmera
    setOrientation(
        gpa = OrientationGPA.PORTRAIT, 
        la  = OrientationLA.PORTRAIT
    )
    setCamera(CameraSelection.FRONT)            // câmera a ser usada

    // Oval de estado
    setOvalColors(
        ready     = "#00FF00".toColorInt(),     // pronto
        notReady  = "#FF0000".toColorInt(),     // não pronto
        stroke    = "#FFFFFF".toColorInt(),     // borda
        completed = "#00FF00".toColorInt()      // concluído
    )

    // Tela de Instruções (InstructionCustomsBuilder)
    setInstructionsTheme {
        setTitleText("Reconhecimento facial")     // texto do título
        setTitleColor("#FFFFFF")                  // cor do título
        setCaptionText("Isso garante que você é você mesmo.")   // legenda
        setCaptionColor("#AAAAAA")                // cor da legenda
        setBackgroundColor("#1F1F1F")             // fundo da modal
        setBottomSheetColor("#333333")            // fundo da bottom sheet
        setFirstInstructionText("Escolha um ambiente bem iluminado") // Legenda da primeira instrução
        setSecondInstructionText("Não use acessórios como bonés mascáras e afins.") // Legenda da segunda instrução
        setBottomSheetCornerRadius(16f)           // raio dos cantos
        setContextImage(R.drawable.ic_example)        // imagem de contexto
        setBackButtonImg(R.drawable.ic_back)      // ícone voltar
        setContinueButtonText("Continuar")          // texto do botão
        setContinueButtonColor("#00FF00")         // cor do botão
        setContinueButtonTextColor("#000000")     // cor do texto do botão
    }

    // Permissões (PermissionCustomsBuilder)
    setPermissionTheme {
        setTitle("Permissões Necessárias")
        setTitleColor("#FFFFFF")
        setSubTitle("Precisamos da câmera pra prosseguir")
        setSubTitleColor("#CCCCCC")
        setCheckPermissionButtonText("Permitir Acesso")
        setCheckPermissionButtonStyle("#00FF00")
        setCameraIcon(R.drawable.ic_camera_perm)
        setBackgroundColor("#1F1F1F")
        setBackButtonIcon(R.drawable.ic_back)
        setPermissionButtonText("OK, liberar")
        setPermissionButtonColor("#00FF00")
        setPermissionButtonTextColor("#000000")
    }

    // Processamento (LivenessCustomsBuilder)
    setProcessingTheme {
        setBackgroundColor("#000000")
        setLoadingDialogColor("#FFFFFF")
        setLoadingIndicatorSize(100)
        setLoadingIndicatorWidth(10)
    }

    // Resultado (ResultCustomsBuilder)
    setResultTheme {
        setSuccessBackgroundColor("#DFFFD6")
        setSuccessIcon(R.drawable.success_icon)
        setSuccessText("Verificação concluída com sucesso!")
        setSuccessTextColor("#0F9D58")

        setErrorBackgroundColor("#FFD6D6")
        setErrorIcon(R.drawable.error_icon)
        setErrorText("Algo deu errado na verificação.")
        setErrorTextColor("#D93025")

        setRetryButtonColor("#0F9D58")
        setRetryButtonText("Tentar novamente")
        setRetryButtonTextColor("#FFFFFF")
    }
}

🚀 Execução da Jornada

val options = IProovManagerOptions(appkey = appKey, theme = theme)

livenessManager.start(options, object : CertifaceResultCallback<LivenessResult> {
    override fun onSuccess(livenessResponse: LivenessResponse) {
        Toast.makeText(context, "Verificação concluída!", Toast.LENGTH_LONG).show()
    }

    override fun onError(livenessResponse: LivenessResponse) {
        val message = livenessResponse.errorResponse?.errorMessage ?: "Erro desconhecido"
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
    }
})

🧩 Provedor: Facetec

A FaceTec oferece um fluxo de verificação com detecção ativa (movimentos, rotação de rosto), com alta personalização visual e textual.

🎨 Personalização Visual

Personalize a interface usando FacetecTheme:

Nota: Propriedades fora dos blocos configuram globalmente a Facetec; dentro dos blocos são específicas de cada tela.

val theme = FacetecTheme.build {
    val facetecFonts = hashMapOf(
        FacetecFontsKey.INSTRUCTIONS_TITLE_FONT to R.font.sixty,
        FacetecFontsKey.INSTRUCTIONS_CAPTION_FONT to R.font.sixty,
        FacetecFontsKey.INSTRUCTIONS_DOCUMENT_TYPES_INSTRUCTIONS_FONT to R.font.sixty,
        FacetecFontsKey.INSTRUCTIONS_DOCUMENT_TIPS_INSTRUCTIONS_FONT to R.font.sixty,
        FacetecFontsKey.INSTRUCTIONS_BUTTON_FONT to R.font.sixty,

        FacetecFontsKey.PERMISSION_TITLE_FONT to R.font.sixty,
        FacetecFontsKey.PERMISSION_CAPTION_FONT to R.font.sixty,
        FacetecFontsKey.PERMISSION_BUTTON_FONT to R.font.sixty,

        FacetecFontsKey.GUIDANCE_CUSTOMIZATION_HEADER_FONT to R.font.sixty,
        FacetecFontsKey.GUIDANCE_CUSTOMIZATION_SUBTEXT_FONT to R.font.sixty,
        FacetecFontsKey.GUIDANCE_CUSTOMIZATION_BUTTON_FONT to R.font.sixty,
        FacetecFontsKey.GUIDANCE_CUSTOMIZATION_READY_SCREEN_HEADER_FONT to R.font.sixty,
        FacetecFontsKey.GUIDANCE_CUSTOMIZATION_READY_SCREEN_SUBTEXT_FONT to R.font.sixty,
        FacetecFontsKey.GUIDANCE_CUSTOMIZATION_RETRY_SCREEN_HEADER_FONT to R.font.sixty,
        FacetecFontsKey.GUIDANCE_CUSTOMIZATION_RETRY_SCREEN_SUBTEXT_FONT to R.font.sixty,

        FacetecFontsKey.RESULT_SCREEN_CUSTOMIZATION_MESSAGE_FONT to R.font.sixty,
        FacetecFontsKey.FEEDBACK_CUSTOMIZATION_TEXT_FONT to R.font.sixty
    )

    val facetecTexts = hashMapOf(
        FacetecTextKey.READY_HEADER_1 to "READY_HEADER_1",
        FacetecTextKey.READY_HEADER_2 to "READY_HEADER_2",
        FacetecTextKey.READY_MESSAGE_1 to "READY_MESSAGE_1",
        FacetecTextKey.READY_MESSAGE_2 to "READY_MESSAGE_2",
        FacetecTextKey.READY_BUTTON to "READY_BUTTON",

        FacetecTextKey.RETRY_HEADER to "RETRY_HEADER",
        FacetecTextKey.RETRY_SUBHEADER to "RETRY_SUBHEADER",
        FacetecTextKey.RETRY_MESSAGE_SMILE to "RETRY_MESSAGE_SMILE",
        FacetecTextKey.RETRY_MESSAGE_LIGHTING to "RETRY_MESSAGE_LIGHTING",
        FacetecTextKey.RETRY_MESSAGE_CONTRAST to "RETRY_MESSAGE_CONTRAST",
        FacetecTextKey.RETRY_YOUR_PICTURE to "RETRY_YOUR_PICTURE",
        FacetecTextKey.RETRY_IDEAL_PICTURE to "RETRY_IDEAL_PICTURE",
        FacetecTextKey.RETRY_BUTTON to "RETRY_BUTTON",

        FacetecTextKey.RESULT_UPLOAD_MESSAGE to "RESULT_UPLOAD_MESSAGE",
        FacetecTextKey.FEEDBACK_LOOK_STRAIGHT_IN_OVAL to "FEEDBACK_LOOK_STRAIGHT_IN_OVAL",
        FacetecTextKey.FEEDBACK_CENTER_FACE to "FEEDBACK_CENTER_FACE",
        FacetecTextKey.FEEDBACK_FACE_NOT_FOUND to "FEEDBACK_FACE_NOT_FOUND",
        FacetecTextKey.FEEDBACK_FACE_NOT_LOOKING_STRAIGHT_AHEAD to "FEEDBACK_FACE_NOT_LOOKING_STRAIGHT_AHEAD",
        FacetecTextKey.FEEDBACK_FACE_NOT_UPRIGHT to "FEEDBACK_FACE_NOT_UPRIGHT",
        FacetecTextKey.FEEDBACK_HOLD_STEADY to "FEEDBACK_HOLD_STEADY",
        FacetecTextKey.FEEDBACK_MOVE_PHONE_AWAY to "FEEDBACK_MOVE_PHONE_AWAY",
        FacetecTextKey.FEEDBACK_MOVE_PHONE_CLOSER to "FEEDBACK_MOVE_PHONE_CLOSER",
        FacetecTextKey.FEEDBACK_MOVE_PHONE_TO_EYE_LEVEL to "FEEDBACK_MOVE_PHONE_TO_EYE_LEVEL",
        FacetecTextKey.FEEDBACK_USE_EVEN_LIGHTING to "FEEDBACK_USE_EVEN_LIGHTING",
        FacetecTextKey.FEEDBACK_FRAME_YOUR_FACE to "FEEDBACK_FRAME_YOUR_FACE",

        FacetecTextKey.FEEDBACK_HOLD_STEADY_1 to "FEEDBACK_HOLD_STEADY_1",
        FacetecTextKey.FEEDBACK_HOLD_STEADY_2 to "FEEDBACK_HOLD_STEADY_2",
        FacetecTextKey.FEEDBACK_HOLD_STEADY_3 to "FEEDBACK_HOLD_STEADY_3",

        FacetecTextKey.FEEDBACK_REMOVE_DARK_GLASSES to "FEEDBACK_REMOVE_DARK_GLASSES",
        FacetecTextKey.FEEDBACK_NEUTRAL_EXPRESSION to "FEEDBACK_NEUTRAL_EXPRESSION",
        FacetecTextKey.FEEDBACK_CONDITIONS_TOO_BRIGHT to "FEEDBACK_CONDITIONS_TOO_BRIGHT",
        FacetecTextKey.FEEDBACK_BRIGHTEN_YOUR_ENVIRONMENT to "FEEDBACK_BRIGHTEN_YOUR_ENVIRONMENT",
    )

    guidanceBackgroundColors("#1F1F1F")
    guidanceForegroundColor("#FFFFFF")

    guidanceReadyScreenHeaderTextColor("#FFFFFF")
    guidanceReadyScreenSubtextTextColor("#BBBBBB")

    guidanceButtonBackgroundHighlightColor("#0F9D58")
    guidanceButtonTextHighlightColor("#000000")
    guidanceButtonBorderColor("#0F9D58")
    guidanceButtonBorderWidth(2)
    guidanceButtonCornerRadius(12)

    guidanceReadyScreenOvalFillColor("#00FF00")

    guidanceRetryScreenHeaderTextColor("#FF5252")
    guidanceRetryScreenSubtextTextColor("#DD3333")
    guidanceRetryScreenImageBorderColor("#417FB2")
    guidanceRetryScreenImageBorderWidth(3)
    guidanceRetryScreenOvalStrokeColor("#FFFFFF")

    resultScreenForegroundColor("#0F9D58")
    resultScreenBackgroundColors("#DFFFD6")
    resultScreenActivityIndicatorColor("#0F9D58")

    resultScreenUploadProgressFillColor("#0F9D58")
    resultScreenUploadProgressTrackColor("#66000000")

    resultScreenResultAnimationBackgroundColor("#417FB2")
    resultScreenResultAnimationForegroundColor("#FFFFFF")

    resultScreenCustomActivityIndicatorImage(R.drawable.success_icon)

    ovalCustomizationStrokeWidth(4)
    ovalCustomizationStrokeColor("#00FF00")

    ovalCustomizationProgressStrokeWidth(6)
    ovalCustomizationProgressColor1("#00FF00")
    ovalCustomizationProgressColor2("#FF0000")
    ovalCustomizationProgressRadialOffset(8)

    frameBorderWidth(2)
    frameBorderColor("#FFFFFF")
    frameCornerRadius(8)
    frameBackgroundColor("#121212")

    overlayBackgroundColor("#80000000")
    overlayBrandingImage(R.drawable.neutral_face)

    feedbackBackgroundColors("#FFFDE7")
    feedbackTextColor("#000000")
    feedbackEnablePulsatingText(true)
    feedbackElevation(8)

    cancelButtonCustomImage(R.drawable.close_icon)
    cancelButtonLocation(FacetecButtonLocation.TOP_RIGHT)

    exitAnimationStyle(FacetecExitAnimationStyle.RIPPLE_IN)

    setFacetecFontsMap(facetecFonts)
    setFacetecTextMap(facetecTexts)

    resultScreenOverrideSuccessMessage("Toque para reiniciar")

    setInstructionsTheme {
        setTitleText("Centralize seu rosto")
        setCaptionText("Mantenha-se dentro do círculo")

        setStatusBarColor("#121212")
        setStatusBarIsDarkIcons(false)

        setBackgroundColor("#121212")

        setContinueButtonText("Começar")
        setContinueButtonColor("#0F9D58")
    }

    setPermissionTheme {
        setTitle("Permissão de Câmera")

        setBackgroundColor("#1F1F1F")

        setStatusBarColor("#1F1F1F")
        setStatusBarIsDarkIcons(false)

        setCheckPermissionButtonText("Permitir")
        setCheckPermissionButtonStyle("#0F9D58")
    }

    setProcessingTheme {
        setBackgroundColor("#000000")

        setLoadingDialogColor("#FFFFFF")

        setStatusBarColor("#000000")
        setStatusBarIsDarkIcons(false)

        setLoadingIndicatorSize(80)
    }
}

🚀 Execução da Jornada

val options = FacetecManagerOptions(appkey = appKey, theme = theme)

livenessManager.start(options, object : CertifaceResultCallback<LivenessResult> {
    override fun onSuccess(result: LivenessResponse) {
        Toast.makeText(context, "Verificação concluída!", Toast.LENGTH_LONG).show()
    }

    override fun onError(result: LivenessResponse) {
        val message = livenessResponse.errorResponse?.errorMessage ?: "Erro desconhecido"
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
    }
})

🛠️FaceTec Versão 10 (Beta)

📘

Importante!

Esta versão encontra-se em fase de testes e validação, não representando o release final do produto. O comportamento atual não deve ser considerado definitivo, podendo sofrer alterações e ajustes antes da disponibilização oficial.

O que mudou na customização

⚠️

A partir da atualização para FaceTec SDK v10, algumas propriedades de customização foram depreciadas e outras adicionadas. Se você já integrava com a v9, revise os pontos abaixo.

Depreciações

v9v10
resultScreenOverrideSuccessMessage()setFacetecTextMap() com FacetecTextKey.RESULT_SUCCESS_MESSAGE
FEEDBACK_HOLD_STEADY_1, _2, _3Apenas FEEDBACK_HOLD_STEADY

Novas propriedades (FacetecTheme)

Retry — slideshow de imagens

PropriedadeDescrição
guidanceRetryScreenSlideshowImagesLista de imagens na tela de retry
guidanceRetryScreenSlideshowIntervalMsIntervalo entre slides (ms)
guidanceRetryScreenSlideshowShuffleEmbaralhar imagens
guidanceRetryScreenIdealImageImagem ideal estática (sem slideshow)

Resultado — falha e cancelamento

PropriedadeDescrição
resultScreenResultAnimationUnsuccessBackgroundColorCor de fundo da animação de falha
resultScreenResultAnimationUnsuccessForegroundColorCor do ícone na animação de falha
resultScreenSessionAbortAnimationBackgroundColorCor de fundo no cancelamento da sessão
resultScreenSessionAbortAnimationForegroundColorCor do ícone no cancelamento
resultScreenSessionAbortAnimationBackgroundImageImagem de fundo no cancelamento
resultScreenCustomSessionAbortAnimationAnimação customizada no cancelamento
resultScreenFaceScanStillUploadingMessageDelayTimeDelay (s) para mensagem de upload em andamento
resultScreenResultAnimationDisplayTimeTempo (s) da animação de resultado

Sessão

PropriedadeDescrição
exitAnimationUnsuccessStyleAnimação de saída após falha (se omitida, usa exitAnimationStyle)
facetecActivityThemeIdTheme Android da activity FaceTec

Valores de FacetecExitAnimationStyle: CIRCLE_FADE, RIPPLE_OUT, RIPPLE_IN, NONE.

Novas chaves de texto

ChaveUso
RESULT_STILL_UPLOADING_MESSAGEMensagem enquanto o upload continua
RESULT_SESSION_ABORT_MESSAGEMensagem quando a sessão é cancelada
💡

RESULT_SUCCESS_MESSAGE continua existindo, mas na v10 aponta para a string de enrollment 3D do SDK.

Exemplo de migração

FacetecTheme.build {
    // Antes (v9): resultScreenOverrideSuccessMessage("Tudo certo!")
    setFacetecTextMap(hashMapOf(
        FacetecTextKey.RESULT_SUCCESS_MESSAGE to "Tudo certo!"
    ))

    // Antes (v9): FEEDBACK_HOLD_STEADY_1, _2, _3
    // Agora: apenas FEEDBACK_HOLD_STEADY

    // Novidades v10
    guidanceRetryScreenSlideshowImages(R.drawable.ex1, R.drawable.ex2)
    exitAnimationUnsuccessStyle(FacetecExitAnimationStyle.CIRCLE_FADE)
    resultScreenResultAnimationUnsuccessBackgroundColor("#5C1A1A")
}
💡

Demais customizações (instruções, permissão, loading, oval, frame, overlay, feedback, fontes e drawables) permanecem iguais.


📦 Estrutura das Classes Importantes

📦 Core SDK

  • CertifaceSDK: Inicialização e gerenciamento.
  • CertifaceSDKConfig: Configuração com AppKey e ambiente.
  • LivenessProvider: Enum de provedores.
  • CertifaceResultCallback: Interface de callbacks.
  • LivenessResponse: Resultado do liveness.

📦 IProov (Provedor)

  • IProovManager: Gerencia o fluxo com IProov.
  • IProovManagerOptions: Define opções do tema.
  • IProovTheme: Personalização visual do fluxo.

📦 Facetec (Provedor)

  • FacetecManager: Gerencia o fluxo com a Facetec.
  • FacetecManagerOptions: Define opções do tema.
  • FacetecTheme: Personalização visual do fluxo.

🔍 Principais Classes e Métodos de Chamada

  • CertifaceSDK.initialize()
  • CertifaceSDK.createLivenessManager()
  • [Provedor]Theme.build {}
  • [Provedor]Manager.start(...)
  • CertifaceResultCallback.onSuccess()
  • CertifaceResultCallback.onError()

📱 Fluxo de Telas

Nesta seção você encontra informações sobre a customização das telas envolvidas nos fluxos de liveness, separadas por provedor:

  • Telas CertiFace: Telas genéricas, reutilizadas por todos os provedores. Permitem alto nível de personalização (cores, textos, layout, etc).
  • Telas IProov: A maior parte das telas é controlada pelo SDK do IProov, mas é possível aplicar personalizações oferecidas pelo produto. A tela de resultado é fornecida pela CertiFace e pode ser customizada.
  • Telas Facetec: As telas fazem parte do SDK da FaceTec e só podem ser personalizadas dentro dos limites oferecidos pelo próprio produto.

📱 Telas CertiFace

Tela Inicial/Instruções: Explicação pré-liveness.

PropriedadeDescriçãoExemplo
1setBackButtonImgDefine a imagem do botão de voltarR.drawable
1setBackButtonColorDefine a cor do botão de voltar#01012e ou R.color
2setBackgroundColorDefine a cor de fundo da tela#170ec4
2setContextImageDefine a imagem de contexto na telaR.drawable
3setTitleColorDefine a cor do título#a83290 ou R.color
3setTitleTextDefine o título da tela de instruçõestitulo exemplo customizado
4setDocumentTypesInstructionIconDefine o ícone para o tipo de documentoR.drawable
4setDocumentTypesInstructionIconBorderColorDefine a cor da borda do ícone do tipo de documento#ff0000 ou R.color
4setDocumentTypesInstructionIconBackgroundColorDefine a cor de fundo do ícone de tipo de documento#cc6f16 ou R.color
5setDocumentTipsInstructionIconDefine o ícone para as dicas de instrução do documentoR.drawable
5setDocumentTipsInstructionIconBackgroundColorDefine a cor de fundo do ícone das dicas#012e0a ou R.color
5setDocumentTipsInstructionIconBorderColorDefine a cor da borda do ícone das dicas#00ff00 ou R.color
6setBottomSheetColorDefine a cor do fundo da barra inferior#3e32a8 ou R.color
6setBottomSheetCornerRadiusDefine o raio de canto da barra inferior15.0f
7setCaptionColorDefine a cor do subtítulo#a86b32 ou R.color
7setCaptionTextDefine o subtítulo da tela de instruçõessubtitulo exemplo customizado
8setDocumentTypesInstructionTextColorDefine a cor do texto de instrução do tipo de documento#a8927d ou R.color
8setDocumentTypesInstructionTextDefine o texto de instrução para o tipo de documentodescricao do primeiro campo
9setDocumentTipsInstructionTextDefine o texto de dica de instrução para o documentodescricao do segundo campo
9setDocumentTipsInstructionTextColorDefine a cor do texto das dicas de instrução do documento#16cc3a ou R.color
10setContinueButtonTextDefine o texto do botão de continuarContinuar button
10setContinueButtonColorDefine a cor de fundo do botão de continuar#2e030a ou R.color
10setContinueButtonTextColorDefine a cor do texto do botão de continuar#0000ff ou R.color
0setStatusBarColorDefine a cor da statusbar do android#0000ff ou R.color
0setStatusBarIsDarkIconsDefine a cor do texto da statusbartrue ou false

Tela de Permissão de Câmera: Solicita permissão.

PropriedadeDescriçãoExemplo
1backButtonIconÍcone do botão de voltarR.drawable.arraow_left_black
2cameraIconÍcone central (ilustração da câmera)R.drawable.camera_permission
3titleTítulo da telaPermissões da câmera desativadas.
3titleColorCor do título#000000
4subTitleSubtítulo explicativoHabilite as configurações do seu aparelho.
4subTitleColorCor do subtítulo#666666
5permissionButtonTextTexto do botão de permitirPermitir
5permissionButtonColorCor de fundo do botão de permitir#00FF00
5permissionButtonTextColorCor do texto do botão#000000
6checkPermissionButtonTextTexto alternativo para botão de checagemPermitir Acesso
6checkPermissionButtonStyleCor (string) para estilo de botão alternativo#00FF00
7backgroundColorCor de fundo da tela inteira#FFFFFF
0setStatusBarColorDefine a cor da statusbar do android#0000ff ou R.color
0setStatusBarIsDarkIconsDefine a cor do texto da statusbartrue ou false

Tela de Processamento: Feedback visual durante verificação.

PropriedadeDescriçãoExemplo
1backgroundColorCor de fundo da tela de loading#000000
2circularProgressIndicatorColorCor do circulo de carregamento#FFFFFF
3circularProgressIndicatorSizeTamanho do circulo (diâmetro em px)100
4circularProgressIndicatorWidthEspessura da linha do circulo10
0setStatusBarColorDefine a cor da statusbar do android#0000ff ou R.color
0setStatusBarIsDarkIconsDefine a cor do texto da statusbartrue ou false

📱 Telas IProov

Tela do IProov: Executa a verificação de liveness.

PropriedadeDescriçãoExemplo
1closeButtonThemeÍcone de fechar a tela do ovalR.drawable.ic_close
2headerBackgroundColorThemeCor do cabeçalho/topo da tela#121212
3promptTextColorThemeCor do texto com instruções do oval#FFFFFF
3promptBackgroundColorThemeCor de fundo da área de instruções#1F1F1F
3promptRoundedCornersThemeDefine se a área de prompt tem bordas arredondadastrue
4ovalStrokeColorCor da borda do oval#FFFFFF
4readyOvalColorCor do oval quando o rosto está enquadrado corretamente#00FF00
4notReadyOvalColorCor do oval quando ainda não está pronto#FF0000
4completedOvalStrokeColorCor do oval quando a verificação foi concluída#00FF00
5filterThemeEstilo visual aplicado ao oval (filtro)FilterTheme.Natural( NaturalStyle.CLEAR)
6disableExteriorEffectsThemeRemove efeitos visuais do ovalfalse
7timeoutSecsThemeTempo máximo de captura antes do timeout60
8enableScreenshotsThemePermite ou bloqueia screenshotstrue ou false
9orientationGPA / orientationLAOrientação permitida para dispositivos específicosPORTRAIT
10cameraThemeSeleciona a câmera frontal ou traseiraFRONT
11titleThemeTexto do cabeçalho no topo"Verificação Facial"
11titleTextColorThemeCor do título#FFFFFF
11logoThemeÍcone ou logo no topoR.drawable.ic_logo
12fontsKeyMapa de fontes do fluxomapOf(...)

Tela de Resultado: [IProov] Exibe resultado final.

PropriedadeDescriçãoExemplo
1successIconÍcone exibido em caso de sucessoR.drawable.success_icon
1errorIconÍcone exibido em caso de erroR.drawable.error_icon
2successTextMensagem exibida em caso de sucessoVerificação concluída com sucesso!
2errorTextMensagem exibida em caso de erroAlgo deu errado na verificação.
2successTextColorCor do texto de sucesso#0F9D58
2errorTextColorCor do texto de erro#D93025
3retryButtonTextTexto do botão de nova tentativaTentar novamente
3retryButtonColorCor de fundo do botão de nova tentativa#0F9D58
3retryButtonTextColorCor do texto do botão de nova tentativa#FFFFFF
4successBackgroundColorCor de fundo da tela de sucesso#DFFFD6
4errorBackgroundColorCor de fundo da tela de erro#FFD6D6
0setStatusBarColorDefine a cor da statusbar do android#0000ff ou R.color
0setStatusBarIsDarkIconsDefine a cor do texto da statusbartrue ou false

📱 Telas Facetec

Exemplo de Customização de Textos

Nesta seção, vamos explorar detalhadamente como personalizar os textos da Facetec para refletir a linguagem e o tom desejados pelo seu aplicativo. A seguir, você verá tabelas e imagens ilustrativas que mostram onde cada texto personalizado aparece na interface, ajudando a entender o impacto de cada configuração visualmente.

💡

Para consultar exemplos de customização visual da Facetec: Clique Aqui


Ready Screen

IdentificadorExemplos para uso de texto
1READY_HEADER_1Prepare-se para seu
2READY_HEADER_2reconhecimento facial.
3READY_MESSAGE_1Posicione o seu rosto na moldura, aproxime-se
4READY_MESSAGE_2e toque em começar.
5READY_BUTTONComeçar

Feedback

IdentificadorExemplos para uso de texto
FEEDBACK_CENTER_FACECentralize Seu Rosto
FEEDBACK_FACE_NOT_FOUNDEnquadre o Seu Rosto
FEEDBACK_FACE_NOT_LOOKING_STRAIGHT_AHEADOlhe Para Frente
FEEDBACK_FACE_NOT_UPRIGHTMantenha a Cabeça Reta
FEEDBACK_HOLD_STEADYSegure Firme
FEEDBACK_MOVE_PHONE_AWAYAfaste-se
FEEDBACK_MOVE_PHONE_CLOSERAproxime-se
FEEDBACK_MOVE_PHONE_TO_EYE_LEVELTelefone ao Nível dos Olhos
FEEDBACK_USE_EVEN_LIGHTINGIlumine Seu Rosto Uniformemente
FEEDBACK_FRAME_YOUR_FACEEncaixe Seu Rosto no Espaço Oval
FEEDBACK_LOOK_STRAIGHT_IN_OVALOlhe Para Frente
FEEDBACK_HOLD_STEADY_1Aguente Firme: 1
FEEDBACK_HOLD_STEADY_2Aguente Firme: 2
FEEDBACK_HOLD_STEADY_3Aguente Firme: 3
FEEDBACK_REMOVE_DARK_GLASSESTire Seus Óculos de Sol
FEEDBACK_NEUTRAL_EXPRESSIONFique Neutro, Não Sorria
FEEDBACK_EYES_STRAIGHT_AHEADOlhe Para Frente
FEEDBACK_CONDITIONS_TOO_BRIGHTAmbiente Muito Iluminado
FEEDBACK_BRIGHTEN_YOUR_ENVIRONMENTAmbiente Muito Escuro

Result Screen

IdentificadorExemplos para uso de texto
RESULT_UPLOAD_MESSAGEEnviando...
RESULT_STILL_UPLOADING_MESSAGEAguarde só mais um momento...
RESULT_SUCCESS_MESSAGESucesso
RESULT_SESSION_ABORT_MESSAGEOcorreu uma falha ao validar o liveness

Retry Screen

IdentificadorExemplos para uso de texto
1RETRY_HEADERVamos tentar novamente?
2RETRY_SUBHEADERSiga o exemplo de foto ideal abaixo:
3RETRY_MESSAGE_SMILEExpressão Neutra, Sem Sorrir.
3RETRY_MESSAGE_LIGHTINGEvite reflexos e iluminação extrema.
3RETRY_MESSAGE_CONTRASTLimpe Sua Câmera.
4RETRY_YOUR_PICTURESua foto.
5RETRY_IDEAL_PICTUREFoto ideal.
6RETRY_BUTTONTentar novamente.

🔤 Fontes

🔤 IProov

Você pode alterar as fontes usadas nas telas de instrução, permissão e resultado passando um mapa para o parâmetro fontsKey.

Esse mapa deve conter as chaves do enum IProovFontsKey associadas a:

  • Um caminho de asset ("fonts/nome_da_fonte.ttf")
  • Ou uma referência de recurso (R.font.nome_da_fonte)
val iProovFonts = mapOf(
    // 📝 Tela de Instruções
    IProovFontsKey.INSTRUCTIONS_TITLE_FONT to "fonts/sixty.ttf", // via assets
    IProovFontsKey.INSTRUCTIONS_CAPTION_FONT to R.font.sixty,    // via recurso
    IProovFontsKey.INSTRUCTIONS_DOCUMENT_TYPES_INSTRUCTIONS_FONT to R.font.sixty,
    IProovFontsKey.INSTRUCTIONS_DOCUMENT_TIPS_INSTRUCTIONS_FONT to R.font.sixty,
    IProovFontsKey.INSTRUCTIONS_BUTTON_FONT to R.font.sixty,

    // 📷 Tela de Permissão de Câmera
    IProovFontsKey.PERMISSION_TITLE_FONT to R.font.sixty,
    IProovFontsKey.PERMISSION_CAPTION_FONT to R.font.sixty,
    IProovFontsKey.PERMISSION_BUTTON_FONT to R.font.sixty,

    // ✅ Tela de Resultado
    IProovFontsKey.RESULT_MESSAGE_FONT to R.font.sixty,
    IProovFontsKey.RESULT_RETRY_BUTTON_FONT to R.font.sixty
)

💡

As fontes relacionadas à tela do iProov em si não são configuradas aqui — elas são passadas diretamente pelo builder do IProovTheme.


🔤 Facetec

Você pode alterar as fontes usadas nas telas de instrução, permissão e para o Fluxo da facetec passando um mapa para o parâmetro fontsKey.

Esse mapa deve conter as chaves do enum FacetecFontsKey associadas a:

  • Um caminho de asset ("fonts/nome_da_fonte.ttf")
  • Ou uma referência de recurso (R.font.nome_da_fonte)
val facetecFonts = hashMapOf(
    FacetecFontsKey.INSTRUCTIONS_TITLE_FONT to R.font.sixty,
    FacetecFontsKey.INSTRUCTIONS_CAPTION_FONT to R.font.sixty,
    FacetecFontsKey.INSTRUCTIONS_DOCUMENT_TYPES_INSTRUCTIONS_FONT to R.font.sixty,
    FacetecFontsKey.INSTRUCTIONS_DOCUMENT_TIPS_INSTRUCTIONS_FONT to R.font.sixty,
    FacetecFontsKey.INSTRUCTIONS_BUTTON_FONT to R.font.sixty,

    FacetecFontsKey.PERMISSION_TITLE_FONT to R.font.sixty,
    FacetecFontsKey.PERMISSION_CAPTION_FONT to R.font.sixty,
    FacetecFontsKey.PERMISSION_BUTTON_FONT to R.font.sixty,

    FacetecFontsKey.GUIDANCE_CUSTOMIZATION_HEADER_FONT to R.font.sixty,
    FacetecFontsKey.GUIDANCE_CUSTOMIZATION_SUBTEXT_FONT to R.font.sixty,
    FacetecFontsKey.GUIDANCE_CUSTOMIZATION_BUTTON_FONT to R.font.sixty,
    FacetecFontsKey.GUIDANCE_CUSTOMIZATION_READY_SCREEN_HEADER_FONT to R.font.sixty,
    FacetecFontsKey.GUIDANCE_CUSTOMIZATION_READY_SCREEN_SUBTEXT_FONT to R.font.sixty,
    FacetecFontsKey.GUIDANCE_CUSTOMIZATION_RETRY_SCREEN_HEADER_FONT to R.font.sixty,
    FacetecFontsKey.GUIDANCE_CUSTOMIZATION_RETRY_SCREEN_SUBTEXT_FONT to R.font.sixty,
    FacetecFontsKey.RESULT_SCREEN_CUSTOMIZATION_MESSAGE_FONT to R.font.sixty,
    FacetecFontsKey.FEEDBACK_CUSTOMIZATION_TEXT_FONT to R.font.sixty
)

🧪 Ambiente de Testes

Utilize ambiente HML com AppKeys de teste fornecidas.

⚠️

Evite usar produção para testes.

💡

Importante:

Para simular o cenário de sucesso no IProov é necessário que o APK esteja assinado.

  • Em ambiente de desenvolvimento, pode ser usada a assinatura debug.keystore.
  • Em produção, utilize a assinatura oficial do aplicativo.

🛠️ Boas Práticas

  • Inicialize o SDK uma vez.
  • Personalize visualmente para refletir a identidade visual do seu aplicativo.
  • Garanta a permissão de câmera ou deixe por parte do SDK solicitar.
  • Trate de forma clara os retornos do SDK para uma experiencia tranquila.
  • Utilize os contratos fornecidos pelo SDK e exports.

📜 Changelogs e Versões

VersãoDataDescrição
1.0.018/09/2025Lançamento Oficial.
1.0.103/10/2025Atualização da Facetec.
1.0.230/10/2025Atualização do IProov.
1.0.318/11/2025Atualização da Facetec e do IProov.

🔗 Links Externos

⚠️

Sempre consulte a documentação atualizada.