Quando uma chamada para a biblioteca Firebase PNV falha, ela informa um
FirebasePhoneNumberVerificationException.
Nesta página, listamos todos os códigos do erro que a exceção pode conter, quando cada um
ocorre e o que seu app precisa fazer a respeito.
Nesta página, presumimos que você tenha integrado o Firebase PNV conforme descrito em Começar a usar o Firebase Phone Number Verification no Android.
Como os erros são informados
Os métodos assíncronos (
getVerificationSupportInfo(),getVerifiedPhoneNumber()e os métodos de fluxo personalizado) retornam umTask. Quando elas falham, oTaskfalha com umFirebasePhoneNumberVerificationException, que você recebe emaddOnFailureListener.enableTestSession()é síncrono. Ele gera umFirebasePhoneNumberVerificationExceptiondiretamente.
Leia o errorCode da exceção para descobrir o que deu errado. Os códigos Firebase PNV
são constantes na
classe
FirebasePnvStatusCodes. Se a falha for do Google Play Services, errorCode também pode ser um valor
CommonStatusCodes,
como NETWORK_ERROR.
Um dispositivo ou chip incompatível não é um erro. getVerificationSupportInfo()
for bem-sucedido e informar isSupported() como false para esse chip, e getReason()
informar o motivo. Consulte Dispositivos e chips incompatíveis.
Códigos de erro
Configuração da sessão de teste
Esses erros são gerados de forma síncrona por enableTestSession().
| Código do erro | Causa | Ação recomendada |
|---|---|---|
TEST_SESSION_ALREADY_ENABLED(55508) |
enableTestSession() foi chamado mais de uma vez no mesmo
processo do app. FirebasePhoneNumberVerification.getInstance()
retorna a mesma instância sempre, então isso também acontece quando uma
Activity que a chama é recriada. |
Chame enableTestSession() uma vez por processo, por exemplo, em
Application.onCreate(). Consulte
Inicializar a biblioteca no modo de
teste. |
INVALID_TEST_NUMBER_ID(55507) |
O token de teste transmitido para enableTestSession() está
vazio. |
Verifique se o build transmite o token gerado no
console do Firebase e só chame enableTestSession() quando o
token não estiver vazio. |
Verificação
Esses erros causam falha no Task retornado por getVerifiedPhoneNumber().
| Código do erro | Causa | Ação recomendada |
|---|---|---|
CREDENTIAL_MANAGER_ERROR(55506) |
O Gerenciador de credenciais do Android não retornou o número de telefone. Se o
cause da exceção for um
GetCredentialCancellationException, é provável que o usuário
tenha dispensado a tela de permissão. |
Ofereça outra maneira de verificar o número de telefone, como SMS. Não tente novamente de forma automática, porque o usuário veria a tela de permissão novamente. |
CARRIER_NOT_SUPPORTED(55501) |
A operadora do chip selecionado não é compatível ou o dispositivo não tem as informações de assinatura necessárias para verificação. | Use outro método de verificação, como SMS. |
UNSUPPORTED_OPERATION(55505) |
O Firebase PNV não está disponível para essa solicitação no dispositivo. | Use outro método de verificação, como SMS. |
PREFLIGHT_CHECK_FAILED(55504) |
O back-end do Firebase PNV não conseguiu criar a solicitação de verificação antes que a tela de permissão fosse mostrada. | Use outro método de verificação, como SMS. Se isso acontecer em todas as solicitações, verifique se o app está configurado corretamente (consulte Fazer upgrade para o modo de produção). |
INTEGRITY_CHECK_FAILED(55503) |
O dispositivo ou app não passou em uma verificação de integridade. | Use outro método de verificação, como SMS. |
INVALID_DIGITAL_CREDENTIAL_RESPONSE(55502) |
Não foi possível ler a resposta do Credential Manager ou trocá-la por um número de telefone verificado. | Use outro método de verificação, como SMS. |
INVALID_TEST_NUMBER_ID(55507) |
No modo de teste, o back-end do Firebase PNV rejeitou o token de teste, por exemplo, porque ele expirou. Os tokens de teste têm um TTL de 7 dias. Um token de teste rejeitado geralmente informa esse código. Se você encontrar outros erros no modo de teste, verifique também se o token está atualizado. | Gere um novo token de teste no console do Firebase e recrie o app. |
ACTIVITY_CONTEXT_REQUIRED(55509) |
O Context transmitido para getVerifiedPhoneNumber()
não é um Activity. O método precisa de um Activity para mostrar a tela de permissão. |
Transmita o Activity atual. Esse é um bug no app, não
uma condição a ser processada no ambiente de execução. |
Verificação de suporte
O Task retornado por getVerificationSupportInfo() falhará apenas se a verificação
em si não puder ser executada. Nesse caso, errorCode é um valor CommonStatusCodes do Google Play Services ou CARRIER_NOT_SUPPORTED. Trate o dispositivo como
não compatível e use outro método de verificação, como SMS.
Enquanto uma sessão de teste está ativada, o getVerificationSupportInfo() não entra em contato
com o back-end do Firebase PNV e sempre informa o chip de teste como compatível, mesmo que o
token de teste tenha expirado.
Fluxo personalizado
Se você usar o fluxo personalizado em vez de
getVerifiedPhoneNumber():
getDigitalCredentialPayload()falha comPREFLIGHT_CHECK_FAILEDou comINVALID_TEST_NUMBER_IDse o back-end rejeitar o token de teste.exchangeCredentialResponseForPhoneNumber()falha comINVALID_DIGITAL_CREDENTIAL_RESPONSEou comINVALID_TEST_NUMBER_IDse o back-end rejeitar o token de teste.- Sua própria chamada para o Credential Manager gera um
GetCredentialException, que você processa diretamente.
Dispositivos e chips incompatíveis
Quando isSupported() é false para um chip, getReason() retorna um dos
seguintes
valores
VerificationSupportStatus:
| Valor | Significado |
|---|---|
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED |
A operadora do chip não é compatível. Consulte as operadoras aceitas. |
INCAPABLE_DUE_TO_ANDROID_VERSION |
O dispositivo executa uma versão do Android anterior ao Android 9 (nível 28 da API). |
INCAPABLE_DUE_TO_SIM_STATE |
O chip não está pronto. Um chip bloqueado ou que ainda está carregando também pode informar INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED, porque a operadora é verificada primeiro. |
Em cada caso, use outro método de verificação, como SMS, para esse chip.
Exemplo
O exemplo a seguir processa os erros que um app típico precisa
distinguir ao chamar 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()
}
}
}
Neste exemplo, showSmsVerification() é o fluxo de verificação de número de telefone
do seu app.
Próximas etapas
- Para detalhes sobre cada classe e constante, consulte a referência da API Firebase PNV.
- Para verificar o token no servidor, consulte Verificar tokens do Firebase PNV.