Dialogfeld für biometrische Authentifizierung anzeigen

Eine Möglichkeit, vertrauliche Informationen oder Premiuminhalte in Ihrer App zu schützen, ist die biometrische Authentifizierung, z. B. mithilfe der Gesichts- oder Fingerabdruckerkennung. In diesem Leitfaden wird erläutert, wie die biometrische Anmeldung unterstützt wird Abläufe in Ihrer App.

Im Allgemeinen sollten Sie den Anmeldedaten-Manager für die Erstanmeldung auf auf einem Gerät. Nachfolgende erneute Autorisierungen können mit biometrischen Prompts, oder Anmeldedaten-Manager. Der Vorteil von biometrischen Prompts besteht darin, mehr Anpassungsoptionen, während der Credential Manager eine in beiden Abläufen implementieren.

Gib die von deiner App unterstützten Authentifizierungstypen an

Verwenden Sie die Schnittstelle BiometricManager.Authenticators, um die von Ihrer App unterstützten Authentifizierungstypen zu definieren. Mit dem System können Sie die folgenden Arten von Authentifizierung:

BIOMETRIC_STRONG
Authentifizierung mit einem biometrischen Verfahren der Klasse 3, wie auf der Seite Android-Kompatibilitätsdefinition beschrieben.
BIOMETRIC_WEAK
Authentifizierung mit einem biometrischen Verfahren der Klasse 2, wie auf der Kompatibilität mit Android Definition Seite.
DEVICE_CREDENTIAL
Authentifizierung mit Anmeldedaten für die Displaysperre – PIN, Muster oder Passwort des Nutzers.

Um einen Authenticator verwenden zu können, muss der Nutzer eine PIN erstellen, oder Passwort haben. Wenn Nutzende noch keines haben, werden die biometrischen werden sie aufgefordert, eines zu erstellen.

Um die Arten der biometrischen Authentifizierung zu definieren, die deine App akzeptiert, übergib ein oder eine bitweise Kombination von Typen im setAllowedAuthenticators() . Im folgenden Code-Snippet wird gezeigt, wie die Authentifizierung mithilfe eines biometrischen Geräts der Klasse 3 oder eines Anmeldedatensatzes für die Bildschirmsperre unterstützt wird.

Kotlin

// Lets the user authenticate using either a Class 3 biometric or
// their lock screen credential (PIN, pattern, or password).
promptInfo = BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setAllowedAuthenticators(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)
        .build()

Java

// Lets user authenticate using either a Class 3 biometric or
// their lock screen credential (PIN, pattern, or password).
promptInfo = new BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)
        .build();

Die folgenden Kombinationen von Authenticator-Typen werden nicht unterstützt auf Android 10 (API-Level 29) und niedriger: DEVICE_CREDENTIAL und BIOMETRIC_STRONG | DEVICE_CREDENTIAL. Wenn Sie unter Android 10 oder niedriger prüfen möchten, ob eine PIN, ein Muster oder ein Passwort vorhanden ist, verwenden Sie die Methode KeyguardManager.isDeviceSecure().

Prüfen, ob die biometrische Authentifizierung verfügbar ist

Nachdem Sie entschieden haben, welche Authentifizierungselemente Ihre App unterstützt, prüfen Sie, diese Elemente verfügbar sind. Dazu übergeben Sie die gleiche binäre Kombination von Typen, die Sie mit der Methode setAllowedAuthenticators() deklariert haben, an die Methode canAuthenticate(). Rufen Sie bei Bedarf die Intent-Aktion ACTION_BIOMETRIC_ENROLL auf. Geben Sie im Intent-Extra die Authenticator an, die von Ihrer App akzeptiert werden. Bei diesem Intent wird der Nutzer aufgefordert, Anmeldedaten für einen Authenticator zu registrieren, der von Ihrer App akzeptiert wird.

Kotlin

val biometricManager = BiometricManager.from(this)
when (biometricManager.canAuthenticate(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)) {
    BiometricManager.BIOMETRIC_SUCCESS ->
        Log.d("MY_APP_TAG", "App can authenticate using biometrics.")
    BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
        Log.e("MY_APP_TAG", "No biometric features available on this device.")
    BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
        Log.e("MY_APP_TAG", "Biometric features are currently unavailable.")
    BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
        // Prompts the user to create credentials that your app accepts.
        val enrollIntent = Intent(Settings.ACTION_BIOMETRIC_ENROLL).apply {
            putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED,
                BIOMETRIC_STRONG or DEVICE_CREDENTIAL)
        }
        startActivityForResult(enrollIntent, REQUEST_CODE)
    }
}

Java

BiometricManager biometricManager = BiometricManager.from(this);
switch (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
    case BiometricManager.BIOMETRIC_SUCCESS:
        Log.d("MY_APP_TAG", "App can authenticate using biometrics.");
        break;
    case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
        Log.e("MY_APP_TAG", "No biometric features available on this device.");
        break;
    case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
        Log.e("MY_APP_TAG", "Biometric features are currently unavailable.");
        break;
    case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
        // Prompts the user to create credentials that your app accepts.
        final Intent enrollIntent = new Intent(Settings.ACTION_BIOMETRIC_ENROLL);
        enrollIntent.putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED,
                BIOMETRIC_STRONG | DEVICE_CREDENTIAL);
        startActivityForResult(enrollIntent, REQUEST_CODE);
        break;
}

Festlegen, wie sich der Nutzer authentifiziert hat

Nach der Authentifizierung des Nutzers können Sie überprüfen, ob er sich mit Anmeldedaten eines Geräts oder biometrischen Anmeldedaten, indem Sie getAuthenticationType()

Anmeldeaufforderung anzeigen

Wenn Sie eine Systemaufforderung anzeigen lassen möchten, in der der Nutzer aufgefordert wird, sich mit biometrischen Anmeldedaten zu authentifizieren, verwenden Sie die Biometriebibliothek. Dieser vom System bereitgestellte Dialog ist in allen Apps, in denen er verwendet wird, einheitlich. Das schafft Vertrauen bei den Nutzern. In Abbildung 1 sehen Sie ein Beispieldialogfeld.

Screenshot mit Dialogfeld
Abbildung 1: Systemdialog, in dem eine biometrische Authentifizierung angefordert wird

So fügen Sie Ihrer App mithilfe der Biometric Library eine biometrische Authentifizierung hinzu: führen Sie die folgenden Schritte aus:

  1. Füge in der Datei build.gradle deines App-Moduls eine Abhängigkeit vom androidx.biometric Mediathek.

  2. Zeigen Sie in der Aktivität oder dem Fragment, die das Dialogfeld für die biometrische Anmeldung enthält, Folgendes an: das Dialogfeld mit der im folgenden Code-Snippet gezeigten Logik:

    Kotlin

    private lateinit var executor: Executor
    private lateinit var biometricPrompt: BiometricPrompt
    private lateinit var promptInfo: BiometricPrompt.PromptInfo
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        executor = ContextCompat.getMainExecutor(this)
        biometricPrompt = BiometricPrompt(this, executor,
                object : BiometricPrompt.AuthenticationCallback() {
            override fun onAuthenticationError(errorCode: Int,
                    errString: CharSequence) {
                super.onAuthenticationError(errorCode, errString)
                Toast.makeText(applicationContext,
                    "Authentication error: $errString", Toast.LENGTH_SHORT)
                    .show()
            }
    
            override fun onAuthenticationSucceeded(
                    result: BiometricPrompt.AuthenticationResult) {
                super.onAuthenticationSucceeded(result)
                Toast.makeText(applicationContext,
                    "Authentication succeeded!", Toast.LENGTH_SHORT)
                    .show()
            }
    
            override fun onAuthenticationFailed() {
                super.onAuthenticationFailed()
                Toast.makeText(applicationContext, "Authentication failed",
                    Toast.LENGTH_SHORT)
                    .show()
            }
        })
    
        promptInfo = BiometricPrompt.PromptInfo.Builder()
                .setTitle("Biometric login for my app")
                .setSubtitle("Log in using your biometric credential")
                .setNegativeButtonText("Use account password")
                .build()
    
        // Prompt appears when user clicks "Log in".
        // Consider integrating with the keystore to unlock cryptographic operations,
        // if needed by your app.
        val biometricLoginButton =
                findViewById<Button>(R.id.biometric_login)
        biometricLoginButton.setOnClickListener {
            biometricPrompt.authenticate(promptInfo)
        }
    }

    Java

    private Executor executor;
    private BiometricPrompt biometricPrompt;
    private BiometricPrompt.PromptInfo promptInfo;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        executor = ContextCompat.getMainExecutor(this);
        biometricPrompt = new BiometricPrompt(MainActivity.this,
                executor, new BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode,
                    @NonNull CharSequence errString) {
                super.onAuthenticationError(errorCode, errString);
                Toast.makeText(getApplicationContext(),
                    "Authentication error: " + errString, Toast.LENGTH_SHORT)
                    .show();
            }
    
            @Override
            public void onAuthenticationSucceeded(
                    @NonNull BiometricPrompt.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                Toast.makeText(getApplicationContext(),
                    "Authentication succeeded!", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
                Toast.makeText(getApplicationContext(), "Authentication failed",
                    Toast.LENGTH_SHORT)
                    .show();
            }
        });
    
        promptInfo = new BiometricPrompt.PromptInfo.Builder()
                .setTitle("Biometric login for my app")
                .setSubtitle("Log in using your biometric credential")
                .setNegativeButtonText("Use account password")
                .build();
    
        // Prompt appears when user clicks "Log in".
        // Consider integrating with the keystore to unlock cryptographic operations,
        // if needed by your app.
        Button biometricLoginButton = findViewById(R.id.biometric_login);
        biometricLoginButton.setOnClickListener(view -> {
                biometricPrompt.authenticate(promptInfo);
        });
    }

Eine kryptografische Lösung verwenden, die von der Authentifizierung abhängt

Zum weiteren Schutz sensibler Daten in Ihrer App können Sie Kryptografie in Ihren Workflow für die biometrische Authentifizierung mit einer Instanz von CryptoObject Das Framework unterstützt die folgenden kryptografischen Objekte: Signature, Cipher und Mac

Nachdem sich der Nutzer erfolgreich über eine biometrische Aufforderung authentifiziert hat, kann Ihre App einen kryptografischen Vorgang auszuführen. Wenn Sie sich beispielsweise mit einem Cipher-Objekt authentifizieren, kann Ihre App die Verschlüsselung und Entschlüsselung mit einem SecretKey-Objekt ausführen.

In den folgenden Abschnitten werden Beispiele für die Verwendung eines Cipher-Objekts und eines SecretKey-Objekts zum Verschlüsseln von Daten aufgeführt. In jedem Beispiel werden die folgenden Methoden verwendet:

Kotlin

private fun generateSecretKey(keyGenParameterSpec: KeyGenParameterSpec) {
    val keyGenerator = KeyGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
    keyGenerator.init(keyGenParameterSpec)
    keyGenerator.generateKey()
}

private fun getSecretKey(): SecretKey {
    val keyStore = KeyStore.getInstance("AndroidKeyStore")

    // Before the keystore can be accessed, it must be loaded.
    keyStore.load(null)
    return keyStore.getKey(KEY_NAME, null) as SecretKey
}

private fun getCipher(): Cipher {
    return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
            + KeyProperties.BLOCK_MODE_CBC + "/"
            + KeyProperties.ENCRYPTION_PADDING_PKCS7)
}

Java

private void generateSecretKey(KeyGenParameterSpec keyGenParameterSpec) {
    KeyGenerator keyGenerator = KeyGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
    keyGenerator.init(keyGenParameterSpec);
    keyGenerator.generateKey();
}

private SecretKey getSecretKey() {
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");

    // Before the keystore can be accessed, it must be loaded.
    keyStore.load(null);
    return ((SecretKey)keyStore.getKey(KEY_NAME, null));
}

private Cipher getCipher() {
    return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
            + KeyProperties.BLOCK_MODE_CBC + "/"
            + KeyProperties.ENCRYPTION_PADDING_PKCS7);
}

Nur mit biometrischen Anmeldedaten authentifizieren

Wenn Ihre App einen geheimen Schlüssel verwendet, der zum Entsperren biometrische Anmeldedaten erfordert, muss sich der Nutzer jeweils mit seinen biometrischen Anmeldedaten authentifizieren, bevor Ihre App auf den Schlüssel zugreift.

Wenn Sie vertrauliche Daten erst verschlüsseln möchten, nachdem sich der Nutzer mit biometrischen Anmeldedaten authentifiziert hat, führen Sie die folgenden Schritte aus:

  1. Generieren Sie einen Schlüssel mit der folgenden KeyGenParameterSpec-Konfiguration:

    Kotlin

    generateSecretKey(KeyGenParameterSpec.Builder(
            KEY_NAME,
            KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
            .setUserAuthenticationRequired(true)
            // Invalidate the keys if the user has registered a new biometric
            // credential, such as a new fingerprint. Can call this method only
            // on Android 7.0 (API level 24) or higher. The variable
            // "invalidatedByBiometricEnrollment" is true by default.
            .setInvalidatedByBiometricEnrollment(true)
            .build())

    Java

    generateSecretKey(new KeyGenParameterSpec.Builder(
            KEY_NAME,
            KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
            .setUserAuthenticationRequired(true)
            // Invalidate the keys if the user has registered a new biometric
            // credential, such as a new fingerprint. Can call this method only
            // on Android 7.0 (API level 24) or higher. The variable
            // "invalidatedByBiometricEnrollment" is true by default.
            .setInvalidatedByBiometricEnrollment(true)
            .build());
  2. Starten Sie einen Workflow für die biometrische Authentifizierung, der eine Chiffre enthält:

    Kotlin

    biometricLoginButton.setOnClickListener {
        // Exceptions are unhandled within this snippet.
        val cipher = getCipher()
        val secretKey = getSecretKey()
        cipher.init(Cipher.ENCRYPT_MODE, secretKey)
        biometricPrompt.authenticate(promptInfo,
                BiometricPrompt.CryptoObject(cipher))
    }

    Java

    biometricLoginButton.setOnClickListener(view -> {
        // Exceptions are unhandled within this snippet.
        Cipher cipher = getCipher();
        SecretKey secretKey = getSecretKey();
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        biometricPrompt.authenticate(promptInfo,
                new BiometricPrompt.CryptoObject(cipher));
    });
  3. Verschlüsseln Sie in Ihren Rückrufen für die biometrische Authentifizierung die vertraulichen Daten mit dem geheimen Schlüssel:

    Kotlin

    override fun onAuthenticationSucceeded(
            result: BiometricPrompt.AuthenticationResult) {
        val encryptedInfo: ByteArray = result.cryptoObject.cipher?.doFinal(
            // plaintext-string text is whatever data the developer would like
            // to encrypt. It happens to be plain-text in this example, but it
            // can be anything
                plaintext-string.toByteArray(Charset.defaultCharset())
        )
        Log.d("MY_APP_TAG", "Encrypted information: " +
                Arrays.toString(encryptedInfo))
    }

    Java

    @Override
    public void onAuthenticationSucceeded(
            @NonNull BiometricPrompt.AuthenticationResult result) {
        // NullPointerException is unhandled; use Objects.requireNonNull().
        byte[] encryptedInfo = result.getCryptoObject().getCipher().doFinal(
            // plaintext-string text is whatever data the developer would like
            // to encrypt. It happens to be plain-text in this example, but it
            // can be anything
                plaintext-string.getBytes(Charset.defaultCharset()));
        Log.d("MY_APP_TAG", "Encrypted information: " +
                Arrays.toString(encryptedInfo));
    }

Authentifizierung mit biometrischen Daten oder Anmeldedaten für die Sperrbildschirmsperre

Sie können einen geheimen Schlüssel für die Authentifizierung mit einem biometrischen Verfahren verwenden. Anmeldedaten oder Anmeldedaten für den Sperrbildschirm (PIN, Muster oder Passwort) Geben Sie beim Konfigurieren dieses Schlüssels einen Gültigkeitszeitraum an. Während dieses Zeitraums kann Ihre App mehrere kryptografische Vorgänge ausführen, ohne dass sich der Nutzer noch einmal authentifizieren muss.

So verschlüsseln Sie vertrauliche Daten, nachdem sich der Nutzer mit biometrischen Anmeldedaten oder Anmeldedaten für den Sperrbildschirm authentifiziert hat:

  1. Generieren Sie einen Schlüssel mit der folgenden KeyGenParameterSpec-Konfiguration:

    Kotlin

    generateSecretKey(KeyGenParameterSpec.Builder(
        KEY_NAME,
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
        .setUserAuthenticationRequired(true)
        .setUserAuthenticationParameters(VALIDITY_DURATION_SECONDS,
                ALLOWED_AUTHENTICATORS)
        .build())

    Java

    generateSecretKey(new KeyGenParameterSpec.Builder(
        KEY_NAME,
        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
        .setUserAuthenticationRequired(true)
        .setUserAuthenticationParameters(VALIDITY_DURATION_SECONDS,
                ALLOWED_AUTHENTICATORS)
        .build());
  2. Verschlüsseln Sie die vertraulichen Daten innerhalb von VALIDITY_DURATION_SECONDS Stunden nach der Nutzerauthentifizierung:

    Kotlin

    private fun encryptSecretInformation() {
        // Exceptions are unhandled for getCipher() and getSecretKey().
        val cipher = getCipher()
        val secretKey = getSecretKey()
        try {
            cipher.init(Cipher.ENCRYPT_MODE, secretKey)
            val encryptedInfo: ByteArray = cipher.doFinal(
                // plaintext-string text is whatever data the developer would
                // like to encrypt. It happens to be plain-text in this example,
                // but it can be anything
                    plaintext-string.toByteArray(Charset.defaultCharset()))
            Log.d("MY_APP_TAG", "Encrypted information: " +
                    Arrays.toString(encryptedInfo))
        } catch (e: InvalidKeyException) {
            Log.e("MY_APP_TAG", "Key is invalid.")
        } catch (e: UserNotAuthenticatedException) {
            Log.d("MY_APP_TAG", "The key's validity timed out.")
            biometricPrompt.authenticate(promptInfo)
        }

    Java

    private void encryptSecretInformation() {
        // Exceptions are unhandled for getCipher() and getSecretKey().
        Cipher cipher = getCipher();
        SecretKey secretKey = getSecretKey();
        try {
            // NullPointerException is unhandled; use Objects.requireNonNull().
            ciper.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedInfo = cipher.doFinal(
                // plaintext-string text is whatever data the developer would
                // like to encrypt. It happens to be plain-text in this example,
                // but it can be anything
                    plaintext-string.getBytes(Charset.defaultCharset()));
        } catch (InvalidKeyException e) {
            Log.e("MY_APP_TAG", "Key is invalid.");
        } catch (UserNotAuthenticatedException e) {
            Log.d("MY_APP_TAG", "The key's validity timed out.");
            biometricPrompt.authenticate(promptInfo);
        }
    }

Mit Schlüsseln zur Authentifizierung authentifizieren

Sie können in Ihrer Instanz von BiometricPrompt die Unterstützung für Authentifizierungsschlüssel pro Nutzung bereitstellen. Bei einem solchen Schlüssel muss der Nutzer jedes Mal, wenn Ihre App auf Daten zugreifen muss, die durch diesen Schlüssel geschützt sind, entweder biometrische Anmeldedaten oder Geräteanmeldedaten vorlegen. Authentifizierungsschlüssel zur einmaligen Verwendung können für Transaktionen mit hohem Wert nützlich sein, z. B. für eine große Zahlung oder die Aktualisierung der Gesundheitsdaten einer Person.

Wenn du ein BiometricPrompt-Objekt mit einem Authentifizierungsschlüssel für die einmalige Verwendung verknüpfen möchtest, füge Code ähnlich dem folgenden hinzu:

Kotlin

val authPerOpKeyGenParameterSpec =
        KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
    // Accept either a biometric credential or a device credential.
    // To accept only one type of credential, include only that type as the
    // second argument.
    .setUserAuthenticationParameters(0 /* duration */,
            KeyProperties.AUTH_BIOMETRIC_STRONG or
            KeyProperties.AUTH_DEVICE_CREDENTIAL)
    .build()

Java

KeyGenParameterSpec authPerOpKeyGenParameterSpec =
        new KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
    // Accept either a biometric credential or a device credential.
    // To accept only one type of credential, include only that type as the
    // second argument.
    .setUserAuthenticationParameters(0 /* duration */,
            KeyProperties.AUTH_BIOMETRIC_STRONG |
            KeyProperties.AUTH_DEVICE_CREDENTIAL)
    .build();

Ohne explizite Nutzeraktion authentifizieren

Standardmäßig müssen Nutzer nach der Annahme ihrer biometrischen Anmeldedaten eine bestimmte Aktion ausführen, z. B. eine Schaltfläche drücken. Dieses wird empfohlen, wenn in Ihrer App das Dialogfeld zum Bestätigen einer sensible oder riskante Aktionen wie ein Kauf.

Wenn in Ihrer App ein Dialogfeld zur biometrischen Authentifizierung für eine risikoarme Aktion angezeigt wird, Sie können dem System jedoch einen Hinweis geben, den der Nutzer Authentifizierung bestätigen. Dieser Hinweis kann es Nutzern ermöglichen, sich Inhalte in deiner App anzusehen nach der erneuten Authentifizierung mithilfe einer passiven Modalität wie Iris-basierte Erkennung. Um diesen Hinweis bereitzustellen, übergeben Sie false in den setConfirmationRequired()-Methode.

Abbildung 2 zeigt zwei Versionen desselben Dialogfelds. Für eine Version ist eine explizite Nutzeraktion erforderlich, für die andere Version nicht.

Screenshot des Dialogfelds Screenshot des Dialogfelds
Abbildung 2: Gesichtserkennung ohne Nutzerbestätigung (oben) und mit Nutzerbestätigung (unten).

Das folgende Code-Snippet zeigt, wie ein Dialogfeld dargestellt wird, das nicht erfordern eine explizite Nutzeraktion, um den Authentifizierungsprozess abzuschließen:

Kotlin

// Lets the user authenticate without performing an action, such as pressing a
// button, after their biometric credential is accepted.
promptInfo = BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setNegativeButtonText("Use account password")
        .setConfirmationRequired(false)
        .build()

Java

// Lets the user authenticate without performing an action, such as pressing a
// button, after their biometric credential is accepted.
promptInfo = new BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setNegativeButtonText("Use account password")
        .setConfirmationRequired(false)
        .build();

Fallback auf nicht biometrische Anmeldedaten zulassen

Wenn du möchtest, dass deine App die Authentifizierung entweder mit einem biometrischen Verfahren oder einem Gerät zulässt kannst du angeben, dass deine App Geräte-Apps Anmeldedaten, indem Sie DEVICE_CREDENTIAL in der Gruppe von Werten, die Sie an setAllowedAuthenticators()

Wenn Ihre App derzeit createConfirmDeviceCredentialIntent() oder setDeviceCredentialAllowed() Wechseln Sie zur Verwendung von setAllowedAuthenticators(), um diese Funktion bereitzustellen.

Weitere Informationen

Weitere Informationen zur biometrischen Authentifizierung unter Android finden Sie in den folgenden Ressourcen.

Blogposts