Fehler bei der Bestätigung der Telefonnummer in Firebase unter Android beheben

Wenn ein Aufruf der Firebase PNV-Bibliothek fehlschlägt, meldet die Bibliothek einen FirebasePhoneNumberVerificationException. Auf dieser Seite werden alle Fehlercodes aufgeführt, die die Ausnahme enthalten kann, wann sie auftreten und was Ihre App tun sollte.

Auf dieser Seite wird davon ausgegangen, dass Sie Firebase PNV wie unter Erste Schritte mit Firebase Phone Number Verification für Android beschrieben eingebunden haben.

Wie Fehler gemeldet werden

  • Asynchrone Methoden (getVerificationSupportInfo(), getVerifiedPhoneNumber() und die Methoden für den benutzerdefinierten Ablauf) geben ein Task-Objekt zurück. Wenn sie fehlschlagen, schlägt die Task mit einem FirebasePhoneNumberVerificationException fehl, den Sie in addOnFailureListener erhalten.

  • enableTestSession() ist synchron. Es wird direkt ein FirebasePhoneNumberVerificationException ausgegeben.

Lesen Sie die errorCode der Ausnahme, um herauszufinden, was schiefgelaufen ist. Die Firebase PNV-Codes sind Konstanten in der Klasse FirebasePnvStatusCodes. Wenn der Fehler von den Google Play-Diensten stammt, kann errorCode auch ein CommonStatusCodes-Wert sein, z. B. NETWORK_ERROR.

Ein nicht unterstütztes Gerät oder eine nicht unterstützte SIM-Karte ist kein Fehler. getVerificationSupportInfo() erfolgreich ist und isSupported() als false für diese SIM meldet und getReason() Ihnen den Grund dafür nennt. Weitere Informationen finden Sie unter Nicht unterstützte Geräte und SIM-Karten.

Fehlercodes

Testsitzung einrichten

Diese Fehler werden synchron von enableTestSession() ausgegeben.

Fehlercode Ursache Empfohlene Maßnahmen
TEST_SESSION_ALREADY_ENABLED
(55508)
enableTestSession() wurde im selben App-Prozess mehrmals aufgerufen. FirebasePhoneNumberVerification.getInstance() gibt jedes Mal dieselbe Instanz zurück. Das passiert also auch, wenn ein Activity, der es aufruft, neu erstellt wird. Rufen Sie enableTestSession() einmal pro Prozess auf, z. B. in Application.onCreate(). Weitere Informationen finden Sie unter Bibliothek im Testmodus initialisieren.
INVALID_TEST_NUMBER_ID
(55507)
Das an enableTestSession() übergebene Testtoken ist leer. Achten Sie darauf, dass Ihr Build das Token übergibt, das Sie in der Firebase-Konsole generiert haben, und rufen Sie enableTestSession() nur auf, wenn das Token nicht leer ist.

Überprüfung

Diese Fehler führen dazu, dass der von getVerifiedPhoneNumber() zurückgegebene Task fehlschlägt.

Fehlercode Ursache Empfohlene Maßnahmen
CREDENTIAL_MANAGER_ERROR
(55506)
Der Android Credential Manager hat die Telefonnummer nicht zurückgegeben. Wenn der cause der Ausnahme ein GetCredentialCancellationException ist, hat der Nutzer den Zustimmungsbildschirm wahrscheinlich geschlossen. Bieten Sie eine andere Möglichkeit zur Bestätigung der Telefonnummer an, z. B. per SMS. Wiederholen Sie den Vorgang nicht automatisch, da der Nutzer sonst den Zustimmungsbildschirm noch einmal sieht.
CARRIER_NOT_SUPPORTED
(55501)
Der Mobilfunkanbieter der ausgewählten SIM wird nicht unterstützt oder das Gerät verfügt nicht über die erforderlichen Aboinformationen, um es zu bestätigen. Verwenden Sie eine andere Bestätigungsmethode, z. B. SMS.
UNSUPPORTED_OPERATION
(55505)
Firebase PNV ist für diese Anfrage auf dem Gerät nicht verfügbar. Verwenden Sie eine andere Bestätigungsmethode, z. B. SMS.
PREFLIGHT_CHECK_FAILED
(55504)
Das Firebase PNV-Backend konnte die Überprüfungsanfrage nicht erstellen, bevor der Zustimmungsbildschirm angezeigt wurde. Verwenden Sie eine andere Bestätigungsmethode, z. B. SMS. Wenn dies bei jeder Anfrage der Fall ist, prüfen Sie, ob Ihre App richtig eingerichtet ist (siehe Upgrade auf den Produktionsmodus).
INTEGRITY_CHECK_FAILED
(55503)
Das Gerät oder die App hat eine Integritätsprüfung nicht bestanden. Verwenden Sie eine andere Bestätigungsmethode, z. B. SMS.
INVALID_DIGITAL_CREDENTIAL_RESPONSE
(55502)
Die Antwort von Credential Manager konnte nicht gelesen oder nicht gegen eine bestätigte Telefonnummer ausgetauscht werden. Verwenden Sie eine andere Bestätigungsmethode, z. B. SMS.
INVALID_TEST_NUMBER_ID
(55507)
Im Testmodus hat das Firebase PNV-Backend das Testtoken abgelehnt, z. B. weil es abgelaufen ist. Test-Tokens haben eine Gültigkeitsdauer von 7 Tagen. Ein abgelehnter Testtoken meldet normalerweise diesen Code. Wenn im Testmodus andere Fehler auftreten, prüfen Sie auch, ob Ihr Token aktuell ist. Generieren Sie in der Firebase-Konsole ein neues Testtoken und erstellen Sie Ihre App neu.
ACTIVITY_CONTEXT_REQUIRED
(55509)
Der an getVerifiedPhoneNumber() übergebene Context ist kein Activity. Die Methode benötigt ein Activity, um den Zustimmungsbildschirm anzuzeigen. Übergeben Sie die aktuelle Activity. Dies ist ein Fehler in Ihrer App, keine Bedingung, die zur Laufzeit verarbeitet werden muss.

Support-Check

Der von getVerificationSupportInfo() zurückgegebene Task schlägt nur fehl, wenn die Prüfung selbst nicht ausgeführt werden kann. In diesem Fall ist errorCode entweder ein CommonStatusCodes-Wert der Google Play-Dienste oder CARRIER_NOT_SUPPORTED. Behandle das Gerät als nicht unterstützt und verwende eine andere Bestätigungsmethode, z. B. SMS.

Während eine Testsitzung aktiviert ist, kontaktiert getVerificationSupportInfo() nicht das Firebase PNV-Backend und meldet die Test-SIM immer als unterstützt, auch wenn das Testtoken abgelaufen ist.

Benutzerdefinierter Ablauf

Wenn Sie den benutzerdefinierten Ablauf anstelle von getVerifiedPhoneNumber() verwenden:

  • getDigitalCredentialPayload() schlägt mit PREFLIGHT_CHECK_FAILED oder mit INVALID_TEST_NUMBER_ID fehl, wenn das Backend Ihr Testtoken ablehnt.
  • exchangeCredentialResponseForPhoneNumber() schlägt mit INVALID_DIGITAL_CREDENTIAL_RESPONSE oder mit INVALID_TEST_NUMBER_ID fehl, wenn das Backend Ihr Testtoken ablehnt.
  • Ihr eigener Aufruf von Credential Manager löst eine GetCredentialException aus, die Sie direkt verarbeiten.

Nicht unterstützte Geräte und SIM-Karten

Wenn isSupported() für eine SIM-Karte false ist, gibt getReason() einen der folgenden VerificationSupportStatus-Werte zurück:

Wert Bedeutung
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED Der Mobilfunkanbieter der SIM wird nicht unterstützt. Unterstützte Mobilfunkanbieter
INCAPABLE_DUE_TO_ANDROID_VERSION Auf dem Gerät wird eine Android-Version vor Android 9 (API-Level 28) ausgeführt.
INCAPABLE_DUE_TO_SIM_STATE Die SIM ist nicht bereit. Eine gesperrte oder noch ladende SIM-Karte kann ebenfalls INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED melden, da der Mobilfunkanbieter zuerst geprüft wird.

Verwenden Sie in jedem Fall eine andere Bestätigungsmethode, z. B. SMS, für diese SIM-Karte.

Beispiel

Im folgenden Beispiel werden die Fehler behandelt, die eine typische App beim Aufrufen von getVerifiedPhoneNumber() unterscheiden muss:

Kotlin

import android.util.Log
// Credential Manager is included with the Firebase PNV library.
import androidx.credentials.exceptions.GetCredentialCancellationException
import com.google.firebase.pnv.FirebasePhoneNumberVerification
import com.google.firebase.pnv.FirebasePhoneNumberVerificationException
import com.google.firebase.pnv.FirebasePnvStatusCodes

private const val TAG = "PhoneVerification"

// In your Activity:
private fun verifyPhoneNumber() {
    FirebasePhoneNumberVerification.getInstance()
        .getVerifiedPhoneNumber(this)
        .addOnSuccessListener { result ->
            // Send result.getToken() to your backend.
        }
        .addOnFailureListener { e -> handleFpnvError(e) }
}

private fun handleFpnvError(e: Exception) {
    if (e !is FirebasePhoneNumberVerificationException) {
        Log.w(TAG, "Firebase PNV failed", e)
        showSmsVerification()
        return
    }
    when (e.errorCode) {
        FirebasePnvStatusCodes.CREDENTIAL_MANAGER_ERROR -> {
            if (e.cause is GetCredentialCancellationException) {
                // The user dismissed the consent screen.
            }
            showSmsVerification()
        }
        FirebasePnvStatusCodes.INVALID_TEST_NUMBER_ID -> {
            // Test mode only: generate a new test token.
            Log.e(TAG, "Firebase PNV test token rejected", e)
        }
        FirebasePnvStatusCodes.ACTIVITY_CONTEXT_REQUIRED -> {
            // App bug: pass an Activity to getVerifiedPhoneNumber().
            Log.e(TAG, "Firebase PNV needs an Activity context", e)
        }
        else -> {
            // Carrier not supported, network errors, and other failures.
            Log.w(TAG, "Firebase PNV failed with error code ${e.errorCode}", e)
            showSmsVerification()
        }
    }
}

In diesem Beispiel ist showSmsVerification() der vorhandene Ablauf zur Bestätigung der Telefonnummer in Ihrer App.

Nächste Schritte