Como autenticar com biometria (digital / Face ID)
Propósito. Proteger uma ação sensível pedindo autenticação biométrica (digital, Face ID/Touch ID, ou Windows Hello no desktop). O resultado chega por callback, de forma assíncrona.
APIs usadas
boolean Biometry.isAvailable()—truese o dispositivo tem ao menos um método biométrico disponível. Chame sempre antes de autenticar.void Biometry.authenticate(String reason, String cancel, boolean onlyBiometric, Biometry.Callback callback)— exibe a UI nativa de biometria.reason— texto explicando por que a autenticação é necessária.cancel— rótulo do botão de cancelar.onlyBiometric—true= só biometria (sem fallback para PIN/senha);false= permite PIN/senha.
Biometry.Callback.onResult(AuthResult result, String message)— resultado assíncrono.Biometry.AuthResult(enum) —SUCCESS,FAILURE,CANCELLED,ERROR.
Nota. O callback chega fora da paint thread — envolva qualquer atualização de UI em
Component.onUI(...). Suporte: Android (BiometricPrompt), iOS (Face ID/Touch ID), desktop limitado (Windows Hello). Os dados biométricos nunca saem do dispositivo — só o resultado é retornado.
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*; // Window, Component, Button, Label
import dev.crossfly.ui.layout.*; // VerticalLayout
import dev.crossfly.device.*; // Biometry, Biometry.AuthResult
/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Label resultado = new Label("");
add(LAY_AUTO, resultado);
Button acao = new Button("Autenticar");
acao.onAction(c ->
{
if (Biometry.isAvailable())
{
Biometry.authenticate(
"Autentique-se para acessar sua conta", // reason
"Cancelar", // cancel
false, // onlyBiometric=false → permite PIN/senha
(result, message) -> Component.onUI(() -> // callback fora da paint thread
{
switch (result)
{
case SUCCESS: resultado.setText("Acesso liberado"); break;
case FAILURE: resultado.setText("Falhou: " + message); break;
case CANCELLED: resultado.setText("Cancelado"); break;
case ERROR: resultado.setText("Erro: " + message); break;
}
}));
}
else
{
resultado.setText("Sem biometria disponível"); // caia para senha/PIN da aplicação
}
});
add(LAY_AUTO, acao);
}
}
O trecho abaixo mostra só o miolo. Para rodar, coloque-o no esqueleto
MainWindowacima.
Trecho mínimo
// verificado na fonte: Biometry.java (isAvailable, authenticate, Callback.onResult, AuthResult)
import dev.crossfly.device.*; // Biometry, Biometry.AuthResult
import dev.crossfly.ui.*; // Component (onUI)
if (Biometry.isAvailable()) {
Biometry.authenticate(
"Autentique-se para acessar sua conta", // reason
"Cancelar", // cancel
false, // onlyBiometric=false → permite PIN/senha
(result, message) -> Component.onUI(() -> { // callback fora da paint thread
switch (result) {
case SUCCESS: liberarAcesso(); break;
case FAILURE: mostrarErro("Falhou: " + message); break;
case CANCELLED: /* usuário cancelou */ break;
case ERROR: mostrarErro("Erro: " + message); break;
}
}));
} else {
// Sem biometria: caia para senha/PIN da aplicação
}
Aprofunde-se
- Guia de biometria: Biometria
Esta página foi útil?Obrigado pelo feedback!