Biometric für Kotlin: Vollständige Anleitung mit Beispielen
Die biometrische Authentifizierung ist aus modernen mobilen Apps nicht mehr wegzudenken. Sie ermöglicht es Nutzern, ihre Identität per Fingerabdruck, Gesichtsscan oder Iriserkennung zu bestätigen – deutlich komfortabler und sicherer als die Eingabe von Passwörtern. Die Biometric-Bibliothek für Kotlin (Teil von AndroidX) bietet eine einheitliche API für die Arbeit mit allen biometrischen Sensoren auf Android-Geräten.
Warum diese Bibliothek nutzen? Erstens abstrahiert sie die Unterschiede in der Implementierung biometrischer Sensoren verschiedener Hersteller. Zweitens behandelt sie automatisch Szenarien, in denen Biometrie nicht verfügbar (z. B. kein Scanner vorhanden) oder gesperrt ist. Drittens ist die Bibliothek eng mit dem Android Keystore integriert, sodass kryptografisch geschützte Schlüssel erstellt werden können, die nur nach erfolgreicher Authentifizierung des Nutzers verwendet werden dürfen.
In diesem Artikel gehen wir detailliert auf alle Aspekte der Arbeit mit der Biometric-Bibliothek für Kotlin ein: von der Installation und einem minimalen Beispiel bis hin zu fortgeschrittenen Techniken und typischen Fehlern. Sie erfahren, wie Sie biometrische Authentifizierung in Ihre App integrieren, sie sicher und benutzerfreundlich gestalten.
Installation
Um die Biometric-Bibliothek in Ihrem Android-Projekt mit Kotlin zu verwenden, fügen Sie die folgende Abhängigkeit in Ihre build.gradle-Datei (Modulebene) ein:
dependencies {
implementation("androidx.biometric:biometric:1.2.0-alpha05")
}
Stellen Sie außerdem sicher, dass in der AndroidManifest.xml die Berechtigung zur Nutzung biometrischer Sensoren deklariert ist:
Wenn Ihre App auf Android 12 (API 31) und höher abzielt, empfiehlt es sich, zusätzlich die Berechtigung zur genauen Bestimmung des Biometrietyps hinzuzufügen:
Schnellstart: Minimales funktionierendes Beispiel
Erstellen wir eine einfache Activity, die beim Klick auf einen Button die biometrische Authentifizierung startet und das Ergebnis in einem Toast anzeigt.
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)
// Prüfen, ob Biometrie auf dem Gerät verfügbar ist
val biometricManager = BiometricManager.from(this)
when (biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_STRONG)) {
BiometricManager.BIOMETRIC_SUCCESS -> {
// Biometrie verfügbar, Dialog konfigurieren
setupBiometricPrompt()
}
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> {
Toast.makeText(this, "Kein biometrischer Sensor auf dem Gerät", Toast.LENGTH_LONG).show()
}
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> {
Toast.makeText(this, "Biometrischer Sensor vorübergehend nicht verfügbar", Toast.LENGTH_LONG).show()
}
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
Toast.makeText(this, "Keine biometrischen Daten hinterlegt", Toast.LENGTH_LONG).show()
}
}
}
private fun setupBiometricPrompt() {
val executor = ContextCompat.getMainExecutor(this)
val callback = object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
Toast.makeText(this@MainActivity, "Fehler: $errString", Toast.LENGTH_SHORT).show()
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
Toast.makeText(this@MainActivity, "Authentifizierung erfolgreich!", Toast.LENGTH_SHORT).show()
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
Toast.makeText(this@MainActivity, "Authentifizierung fehlgeschlagen", Toast.LENGTH_SHORT).show()
}
}
biometricPrompt = BiometricPrompt(this, executor, callback)
promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometrische Anmeldung")
.setSubtitle("Bestätigen Sie Ihre Identität")
.setDescription("Legen Sie Ihren Finger auf den Sensor oder nutzen Sie Face ID")
.setNegativeButtonText("Abbrechen")
.build()
authButton.setOnClickListener {
biometricPrompt.authenticate(promptInfo)
}
}
}