Pular para o conteúdo
CrossFly é 100% open sourceSiga no GitHub
CrossFlyCrossFly
Começar

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() — true se 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 MainWindow acima.

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

Esta página foi útil?