Gestisci gli errori di verifica del numero di telefono di Firebase su Android

Quando una chiamata alla libreria Firebase PNV non va a buon fine, la libreria segnala un errore FirebasePhoneNumberVerificationException. In questa pagina sono elencati tutti i codici di errore che l'eccezione può contenere, quando si verificano e cosa deve fare la tua app.

Questa pagina presuppone che tu abbia integrato Firebase PNV come descritto in Inizia a utilizzare Firebase Phone Number Verification su Android.

Come vengono segnalati gli errori

  • I metodi asincroni (getVerificationSupportInfo(), getVerifiedPhoneNumber() e i metodi del flusso personalizzato) restituiscono un Task. In caso di errore, Task non va a buon fine con un FirebasePhoneNumberVerificationException, che ricevi in addOnFailureListener.

  • enableTestSession() è sincrono. Genera direttamente un FirebasePhoneNumberVerificationException.

Leggi il errorCode dell'eccezione per scoprire cosa non ha funzionato. I codici Firebase PNV sono costanti nella classe FirebasePnvStatusCodes. Se l'errore proviene da Google Play Services, errorCode può anche essere un valore CommonStatusCodes, ad esempio NETWORK_ERROR.

Un dispositivo o una SIM non supportati non sono un errore. getVerificationSupportInfo() ha esito positivo e segnala isSupported() come false per la SIM, mentre getReason() ti spiega il motivo. Consulta la sezione Dispositivi e SIM non supportati.

Codici di errore

Configurazione della sessione di test

Questi errori vengono generati in modo sincrono da enableTestSession().

Codice di errore Causa Azione consigliata
TEST_SESSION_ALREADY_ENABLED
(55508)
enableTestSession() è stato chiamato più di una volta nello stesso processo dell'app. FirebasePhoneNumberVerification.getInstance() restituisce ogni volta la stessa istanza, quindi questo accade anche quando viene ricreato un Activity che la chiama. Chiama enableTestSession() una volta per processo, ad esempio in Application.onCreate(). Consulta Inizializza la libreria in modalità di test.
INVALID_TEST_NUMBER_ID
(55507)
Il token di test passato a enableTestSession() è vuoto. Assicurati che la build passi il token generato nella console Firebase e chiama enableTestSession() solo quando il token non è vuoto.

Verifica

Questi errori causano l'esito negativo di Task restituito da getVerifiedPhoneNumber().

Codice di errore Causa Azione consigliata
CREDENTIAL_MANAGER_ERROR
(55506)
Gestore delle credenziali Android non ha restituito il numero di telefono. Se l'eccezione cause è GetCredentialCancellationException, l'utente molto probabilmente ha ignorato la schermata per il consenso. Offri un altro modo per verificare il numero di telefono, ad esempio tramite SMS. Non riprovare automaticamente, perché l'utente vedrebbe di nuovo la schermata per il consenso.
CARRIER_NOT_SUPPORTED
(55501)
L'operatore della SIM selezionata non è supportato o il dispositivo non dispone delle informazioni sull'abbonamento necessarie per la verifica. Utilizza un altro metodo di verifica, ad esempio gli SMS.
UNSUPPORTED_OPERATION
(55505)
Firebase PNV non è disponibile per questa richiesta sul dispositivo. Utilizza un altro metodo di verifica, ad esempio gli SMS.
PREFLIGHT_CHECK_FAILED
(55504)
Il backend Firebase PNV non ha potuto creare la richiesta di verifica prima che venisse visualizzata la schermata per il consenso. Utilizza un altro metodo di verifica, ad esempio gli SMS. Se si verifica per ogni richiesta, verifica che l'app sia configurata correttamente (consulta Esegui l'upgrade alla modalità di produzione).
INTEGRITY_CHECK_FAILED
(55503)
Il dispositivo o l'app non ha superato un controllo di integrità. Utilizza un altro metodo di verifica, ad esempio gli SMS.
INVALID_DIGITAL_CREDENTIAL_RESPONSE
(55502)
Impossibile leggere la risposta di Gestore delle credenziali o scambiarla con un numero di telefono verificato. Utilizza un altro metodo di verifica, ad esempio gli SMS.
INVALID_TEST_NUMBER_ID
(55507)
In modalità di test, il backend Firebase PNV ha rifiutato il token di test, ad esempio perché è scaduto. I token di test hanno un TTL di 7 giorni. Un token di test rifiutato di solito segnala questo codice. Se visualizzi altri errori in modalità di test, verifica anche che il token sia aggiornato. Genera un nuovo token di test nella console Firebase e ricrea l'app.
ACTIVITY_CONTEXT_REQUIRED
(55509)
Il valore Context passato a getVerifiedPhoneNumber() non è un Activity. Il metodo richiede un Activity per mostrare la schermata per il consenso. Passa l'oggetto Activity corrente. Si tratta di un bug nell'app, non di una condizione da gestire in fase di runtime.

Controllo dell'assistenza

L'oggetto Task restituito da getVerificationSupportInfo() non va a buon fine solo se il controllo stesso non può essere eseguito. In questo caso, errorCode è un valore di Google Play Services CommonStatusCodes o CARRIER_NOT_SUPPORTED. Considera il dispositivo come non supportato e utilizza un altro metodo di verifica, ad esempio l'SMS.

Mentre è attiva una sessione di test, getVerificationSupportInfo() non contatta il backend Firebase PNV e segnala sempre la SIM di test come supportata, anche se il token di test è scaduto.

Flusso personalizzato

Se utilizzi il flusso personalizzato anziché getVerifiedPhoneNumber():

  • getDigitalCredentialPayload() non va a buon fine con PREFLIGHT_CHECK_FAILED o con INVALID_TEST_NUMBER_ID se il backend rifiuta il token di test.
  • exchangeCredentialResponseForPhoneNumber() non riesce con INVALID_DIGITAL_CREDENTIAL_RESPONSE o con INVALID_TEST_NUMBER_ID se il backend rifiuta il token di test.
  • La tua chiamata a Gestore delle credenziali genera un'eccezione GetCredentialException, che gestisci direttamente.

Dispositivi e SIM non supportati

Quando isSupported() è false per una SIM, getReason() restituisce uno dei seguenti valori VerificationSupportStatus:

Valore Significato
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED L'operatore della SIM non è supportato. Consulta Operatori supportati.
INCAPABLE_DUE_TO_ANDROID_VERSION Il dispositivo esegue una versione di Android precedente ad Android 9 (livello API 28).
INCAPABLE_DUE_TO_SIM_STATE La SIM non è pronta. Anche una SIM bloccata o ancora in fase di caricamento può segnalare INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED, perché l'operatore viene controllato per primo.

In ogni caso, utilizza un altro metodo di verifica, ad esempio gli SMS, per la SIM.

Esempio

L'esempio seguente gestisce gli errori che una tipica app deve distinguere quando chiama getVerifiedPhoneNumber():

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 questo esempio, showSmsVerification() è il flusso di verifica del numero di telefono esistente della tua app.

Passaggi successivi