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ą obiektTask. Jeśli się nie powiedzie,Taskzakończy się błędemFirebasePhoneNumberVerificationException, który otrzymasz waddOnFailureListener.enableTestSession()jest synchroniczny. Bezpośrednio wywołujeFirebasePhoneNumberVerificationException.
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łędemPREFLIGHT_CHECK_FAILEDlubINVALID_TEST_NUMBER_ID, jeśli backend odrzuci token testowy.exchangeCredentialResponseForPhoneNumber()kończy się niepowodzeniem z błędemINVALID_DIGITAL_CREDENTIAL_RESPONSElubINVALID_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
- Szczegółowe informacje o poszczególnych klasach i stałych znajdziesz w dokumentacji interfejsu API Firebase PNV.
- Aby dowiedzieć się, jak zweryfikować token na serwerze, przeczytaj artykuł o weryfikowaniu tokenów Firebase PNV.