Biometric für Kotlin: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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)
        }
    }
}

Empfehlungen