Skip to main content
Ao final deste guia o fluxo de verificação abre dentro do seu app Android, com câmera e microfone liberados e os eventos da sessão chegando ao seu código. A SDK não cria a verificação. Ela renderiza uma que já existe, a partir do embed URL que o seu backend recebe em entry.url ao chamar criar verificação.

Pré-requisitos

  • Android Studio recente, com AGP 9 e Gradle 9 ou superior.
  • minSdk 24 e Java 11.
  • Um embed URL emitido pelo seu backend, como em emitir a credencial.
  • Acesso ao artefato. O pacote com.legitimuz:sdk é privado: peça ao suporte a URL do repositório Maven e as credenciais de leitura, ou o .aar da versão que você vai usar.
A chave de API (lz_...) nunca vai para o app. Ela fica no seu servidor. O app recebe apenas o embed URL, que vale para uma verificação e expira.

Confira o exemplo

Os arquivos desta integração, com o destino de cada um.

Configure o projeto

1

Declare o repositório e a dependência

Pelo Maven, androidx.webkit, androidx.browser e androidx.appcompat vêm por transitividade. Pelo .aar, declare as três: sem elas o app compila e quebra em runtime com NoClassDefFoundError.Guarde as credenciais do repositório fora do controle de versão, em ~/.gradle/gradle.properties ou numa variável de ambiente do seu CI.
2

Prepare a Activity que hospeda a verificação

A SDK já declara INTERNET, CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION e ACCESS_COARSE_LOCATION no próprio manifest. O merge traz as cinco para o seu app e você não precisa repeti-las.O que o seu app precisa garantir são duas coisas:
AndroidManifest.xml
A Activity hospedeira tem que ser uma ComponentActivity — uma AppCompatActivity já é. A SDK pede as permissões pelo ActivityResultRegistry dela; sem isso os diálogos do sistema não abrem e a câmera nunca liga.Sem configChanges, uma rotação recria a Activity e derruba a verificação em andamento. A SDK é uma View e não trava a orientação do host por conta própria.
3

Valide o embed URL

Legitimuz.parseEmbedUrl exige https:// e um domínio de verificação da Legitimuz — a WebView só libera câmera e microfone em origem segura.
VerificationActivity.java
Este passo é opcional: createSession valida de novo internamente. Ele existe para dar o retorno ao titular mais cedo.
4

Crie a sessão e anexe a view

VerificationActivity.java
O terceiro parâmetro é requestsDeviceAccessAutomatically. Com true, a SDK pede câmera, microfone e localização assim que a tela é anexada, antes de a página carregar. Passe false se o seu app já pede essas permissões numa tela anterior; mesmo assim a SDK pede o que faltar no momento em que o widget precisar.LegitimuzVerificationView é uma FrameLayout comum, sem toolbar nem navegação própria. Você decide como apresentá-la.
5

Observe os eventos e o desfecho

VerificationActivity.java
Os dois métodos são sempre chamados na thread principal. Se você registrar o callback depois de a verificação já ter terminado, onOutcome dispara na hora.
6

Destrua o handle

VerificationActivity.java
destroy() encerra o fluxo, apaga os cookies e o storage da verificação e destrói a WebView. Chame sempre.

Confira que funcionou

O fluxo abre na primeira etapa e o seu Logcat registra session.started. No dashboard, a verificação sai de not_opened e passa a started.

Eventos

event.getType() devolve a string crua. LegitimuzEventType.fromRawValue(...) converte para o enum quando você quer um switch. Não intercepte terms.open nem redirect.open: a LegitimuzVerificationView já abre essas URLs em Custom Tabs. event.getPayload() é um LegitimuzJsonValue, um envelope JSON genérico para as etapas que emitem dados extras. Acesse com get(...) e os acessores tipados:
Ler o payload
Não decida nada a partir de COMPLETED. isSuccessfulSubmission() confirma que o titular enviou os dados, não que a verificação foi aprovada. O desfecho chega ao seu backend por verification.decided, onde o titular não pode interferir.

Tratamento de erros

Os erros vêm de três lugares, em momentos diferentes.
LegitimuzEmbedUrlError, devolvido por parseEmbedUrl e por createSession. O getMessage() já vem em pt-BR, pronto para exibir.
LegitimuzPublicError chega em onOutcome com getKind() == FAILED.Exiba sempre getDisplayMessage(): ele já resolve a prioridade entre getUserMessage(), getMessage() e o texto genérico.Só erro com isRecoverable() == false encerra a sessão. Erro recuperável aparece em onEvent como session.error e o fluxo continua. O catálogo de códigos está em tratamento de erros.
LOAD_FAILED é problema de rede, DNS ou TLS ao abrir o embed URL, não erro da verificação. A própria view já mostra a tela de “Não foi possível abrir a verificação” com botão de tentar de novo, então normalmente não trate. getLoadFailedMessage() traz o detalhe em pt-BR.onOutcome pode disparar mais de uma vez por causa desse retry.

Casos de borda

Falta o android:configChanges na sua Activity. Veja o segundo passo.
Depois de “não perguntar mais”, só as configurações do sistema resolvem. Mande o titular para lá, explicando antes por que a câmera é necessária:
Abrir as configurações do app
O embed URL vale até o expires_at da verificação. Expirado, peça um novo ao seu backend e crie outra sessão. Não reaproveite o antigo.

Próximo passo

iOS

O mesmo fluxo em Swift.

Receber a decisão

Onde o desfecho realmente chega.