Biometric para Kotlin: guia completo com exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Biometric para Kotlin: guia completo com exemplos práticos

A autenticação biométrica tornou-se essencial em aplicativos mobile modernos. Ela permite que os usuários confirmem sua identidade usando impressão digital, reconhecimento facial ou íris, sendo muito mais prática e segura do que digitar senhas. A biblioteca Biometric para Kotlin (parte do AndroidX) oferece uma API unificada para trabalhar com todos os sensores biométricos em dispositivos Android.

Por que usar essa biblioteca? Primeiro, ela abstrai as diferenças de implementação dos sensores biométricos entre fabricantes. Segundo, gerencia automaticamente cenários onde a biometria não está disponível (ex.: sem leitor) ou está bloqueada. Terceiro, integra-se diretamente com o Android Keystore, permitindo criar chaves criptografadas que só podem ser usadas após autenticação bem-sucedida do usuário.

Neste artigo, vamos detalhar todos os aspectos do uso da biblioteca Biometric para Kotlin: desde a instalação e um exemplo mínimo até técnicas avançadas e erros comuns. Você aprenderá a adicionar autenticação biométrica ao seu app, tornando-o seguro e intuitivo para o usuário.

Instalação

Para usar a biblioteca Biometric no seu projeto Android com Kotlin, adicione a seguinte dependência no arquivo build.gradle (nível do módulo):

dependencies {
    implementation("androidx.biometric:biometric:1.2.0-alpha05")
}

Além disso, certifique-se de declarar a permissão para uso de sensores biométricos no AndroidManifest.xml:

Se seu app for direcionado ao Android 12 (API 31) ou superior, é recomendável adicionar também a permissão para identificar o tipo exato de biometria:


Início rápido: exemplo funcional mínimo

Vamos criar uma Activity simples que, ao clicar em um botão, inicia a autenticação biométrica e exibe o resultado em um Toast.

import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt
import androidx.core.content.ContextCompat
import java.util.concurrent.Executors

class MainActivity : AppCompatActivity() {

    private lateinit var biometricPrompt: BiometricPrompt
    private lateinit var promptInfo: BiometricPrompt.PromptInfo

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val authButton: Button = findViewById(R.id.auth_button)

        // Verifica se a biometria está disponível no dispositivo
        val biometricManager = BiometricManager.from(this)
        when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)) {
            BiometricManager.BIOMETRIC_SUCCESS -> {
                // Biometria disponível, configura o diálogo
                setupBiometricPrompt()
            }
            BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> {
                Toast.makeText(this, "Dispositivo sem sensor biométrico", Toast.LENGTH_LONG).show()
            }
            BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> {
                Toast.makeText(this, "Sensor biométrico temporariamente indisponível", Toast.LENGTH_LONG).show()
            }
            BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
                Toast.makeText(this, "Nenhuma biometria cadastrada", Toast.LENGTH_LONG).show()
            }
        }
    }

    private fun setupBiometricPrompt() {
        val executor = Executors.newSingleThreadExecutor()
        val callback = object : BiometricPrompt.AuthenticationCallback() {
            override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                super.onAuthenticationError(errorCode, errString)
                runOnUiThread {
                    Toast.makeText(this@MainActivity, "Erro: $errString", Toast.LENGTH_SHORT).show()
                }
            }

            override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                super.onAuthenticationSucceeded(result)
                runOnUiThread {
                    Toast.makeText(this@MainActivity, "Autenticação bem-sucedida!", Toast.LENGTH_SHORT).show()
                }
            }

            override fun onAuthenticationFailed() {
                super.onAuthenticationFailed()
                runOnUiThread {
                    Toast.makeText(this@MainActivity, "Falha na autenticação", Toast.LENGTH_SHORT).show()
                }
            }
        }

        biometricPrompt = BiometricPrompt(this, executor, callback)
        promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle("Autenticação Biométrica")
            .setSubtitle("Confirme sua identidade")
            .setDescription("Toque no sensor de impressão digital")
            .setNegativeButtonText("Cancelar")
            .build()

        findViewById

Recommendations