Obsługa błędów weryfikacji numeru telefonu w Firebase na Androidzie

Gdy wywołanie biblioteki Firebase PNV się nie powiedzie, biblioteka zgłasza błąd FirebasePhoneNumberVerificationException. Na tej stronie znajdziesz listę wszystkich kodów błędów, które mogą być związane z wyjątkiem, wraz z informacjami o tym, kiedy dany błąd występuje i co aplikacja powinna w takiej sytuacji zrobić.

Na tej stronie zakładamy, że masz już zintegrowany pakiet Firebase PNV zgodnie z opisem w artykule Pierwsze kroki z Firebase Phone Number Verification na Androidzie.

Jak są raportowane błędy

  • Metody asynchroniczne (getVerificationSupportInfo(), getVerifiedPhoneNumber() i metody niestandardowego procesu) zwracają obiekt Task. Jeśli się nie powiedzie, Task zakończy się błędem FirebasePhoneNumberVerificationException, który otrzymasz w addOnFailureListener.

  • enableTestSession() jest synchroniczny. Bezpośrednio wywołuje FirebasePhoneNumberVerificationException.

Aby dowiedzieć się, co poszło nie tak, przeczytaj errorCode wyjątku. Kody Firebase PNV są stałymi w klasie FirebasePnvStatusCodes. Jeśli błąd pochodzi z Usług Google Play, errorCode może też być wartością CommonStatusCodes, np. NETWORK_ERROR.

Nieobsługiwane urządzenie lub karta SIM nie jest błędem. getVerificationSupportInfo() zakończy się powodzeniem i zgłosi isSupported() jako false dla tej karty SIM, a getReason() poda przyczynę. Zobacz Nieobsługiwane urządzenia i karty SIM.

Kody błędów

Konfiguracja sesji testowej

Te błędy są zgłaszane synchronicznie przez enableTestSession().

Kod błędu Przyczyna Zalecane działanie
TEST_SESSION_ALREADY_ENABLED
(55508)
Metoda enableTestSession() została wywołana więcej niż raz w tym samym procesie aplikacji. FirebasePhoneNumberVerification.getInstance() za każdym razem zwraca tę samą instancję, więc dzieje się tak również wtedy, gdy wywołujący ją element Activity jest tworzony ponownie. Wywołaj enableTestSession() raz na proces, na przykład w Application.onCreate(). Zobacz Inicjowanie biblioteki w trybie testowym.
INVALID_TEST_NUMBER_ID
(55507)
Token testowy przekazany do enableTestSession() jest pusty. Upewnij się, że kompilacja przekazuje token wygenerowany w konsoli Firebase, i wywołuj enableTestSession() tylko wtedy, gdy token nie jest pusty.

Weryfikacja

Te błędy powodują niepowodzenie Task zwracanego przez getVerifiedPhoneNumber().

Kod błędu Przyczyna Zalecane działanie
CREDENTIAL_MANAGER_ERROR
(55506)
Menedżer danych logowania na Androidzie nie zwrócił numeru telefonu. Jeśli cause wyjątku to GetCredentialCancellationException, użytkownik najprawdopodobniej zamknął ekran zgody. Zaoferuj inny sposób weryfikacji numeru telefonu, np. SMS-em. Nie próbuj ponownie automatycznie, ponieważ użytkownik ponownie zobaczy ekran zgody.
CARRIER_NOT_SUPPORTED
(55501)
Operator wybranej karty SIM nie jest obsługiwany lub urządzenie nie ma informacji o subskrypcji potrzebnych do weryfikacji. użyć innej metody weryfikacji, np. SMS-a.
UNSUPPORTED_OPERATION
(55505)
Aplikacja Firebase PNV nie jest dostępna dla tej prośby na urządzeniu. użyć innej metody weryfikacji, np. SMS-a.
PREFLIGHT_CHECK_FAILED
(55504)
Backend Firebase PNV nie mógł utworzyć prośby o weryfikację, zanim został wyświetlony ekran zgody. Użyj innej metody weryfikacji, np. SMS-a. Jeśli dzieje się tak w przypadku każdej prośby, sprawdź, czy aplikacja jest prawidłowo skonfigurowana (patrz Przechodzenie na tryb produkcyjny).
INTEGRITY_CHECK_FAILED
(55503)
Urządzenie lub aplikacja nie przeszły kontroli integralności. Użyj innej metody weryfikacji, np. SMS-a.
INVALID_DIGITAL_CREDENTIAL_RESPONSE
(55502)
Nie udało się odczytać odpowiedzi z Menedżera danych logowania lub nie można jej było wymienić na zweryfikowany numer telefonu. Użyj innej metody weryfikacji, np. SMS-a.
INVALID_TEST_NUMBER_ID
(55507)
W trybie testowym backend Firebase PNV odrzucił token testowy, na przykład dlatego, że wygasł. Tokeny testowe mają 7-dniowy czas życia. Odrzucony token testowy zwykle zgłasza ten kod. Jeśli w trybie testowym widzisz inne błędy, sprawdź, czy token jest aktualny. Wygeneruj nowy token testowy w konsoli Firebase i ponownie skompiluj aplikację.
ACTIVITY_CONTEXT_REQUIRED
(55509)
Wartość Context przekazana do getVerifiedPhoneNumber() nie jest Activity. Metoda wymaga Activity, aby wyświetlić ekran zgody. Przekaż bieżący element Activity. Jest to błąd w aplikacji, a nie warunek do obsłużenia w czasie działania.

Sprawdzanie pomocy

Task zwracany przez getVerificationSupportInfo() kończy się niepowodzeniem tylko wtedy, gdy nie można uruchomić samej kontroli. W takim przypadku errorCode to wartość Usług Google Play CommonStatusCodes lub CARRIER_NOT_SUPPORTED. Potraktuj urządzenie jako nieobsługiwane i użyj innej metody weryfikacji, np. SMS-a.

Gdy sesja testowa jest włączona, getVerificationSupportInfo() nie kontaktuje się z backendem Firebase PNV i zawsze zgłasza testową kartę SIM jako obsługiwaną, nawet jeśli token testowy wygasł.

Przepływ niestandardowy

Jeśli zamiast getVerifiedPhoneNumber() używasz niestandardowego procesu:

  • getDigitalCredentialPayload() kończy się niepowodzeniem z błędem PREFLIGHT_CHECK_FAILED lub INVALID_TEST_NUMBER_ID, jeśli backend odrzuci token testowy.
  • exchangeCredentialResponseForPhoneNumber() kończy się niepowodzeniem z błędem INVALID_DIGITAL_CREDENTIAL_RESPONSE lub INVALID_TEST_NUMBER_ID, jeśli backend odrzuci token testowy.
  • Twoje wywołanie Credential Manager zwraca błąd GetCredentialException, który obsługujesz bezpośrednio.

Nieobsługiwane urządzenia i karty SIM

Gdy isSupported() ma wartość false dla karty SIM, getReason() zwraca jedną z tych wartości VerificationSupportStatus:

Wartość Znaczenie
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED Operator karty SIM nie jest obsługiwany. Zobacz Obsługiwani operatorzy.
INCAPABLE_DUE_TO_ANDROID_VERSION Na urządzeniu jest zainstalowana wersja Androida starsza niż Android 9 (poziom interfejsu API 28).
INCAPABLE_DUE_TO_SIM_STATE Karta SIM nie jest gotowa. Karta SIM, która jest zablokowana lub nadal się wczytuje, może też zgłaszać INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED, ponieważ najpierw sprawdzany jest operator.

W każdym przypadku użyj innej metody weryfikacji, np. SMS-a, dla tej karty SIM.

Przykład

Poniższy przykład obsługuje błędy, które typowa aplikacja musi rozróżniać podczas wywoływania 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()
        }
    }
}

W tym przykładzie showSmsVerification() to dotychczasowy proces weryfikacji numeru telefonu w aplikacji.

Dalsze kroki