Processar erros da verificação de número de telefone do Firebase no Android

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 um Task. Quando elas falham, o Task falha com um FirebasePhoneNumberVerificationException, que você recebe em addOnFailureListener.

  • enableTestSession() é síncrono. Ele gera um FirebasePhoneNumberVerificationException diretamente.

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 com PREFLIGHT_CHECK_FAILED ou com INVALID_TEST_NUMBER_ID se o back-end rejeitar o token de teste.
  • exchangeCredentialResponseForPhoneNumber() falha com INVALID_DIGITAL_CREDENTIAL_RESPONSE ou com INVALID_TEST_NUMBER_ID se 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