Menangani error verifikasi nomor telepon Firebase di Android

Jika panggilan ke library Firebase PNV gagal, library akan melaporkan FirebasePhoneNumberVerificationException. Halaman ini mencantumkan setiap kode error yang dapat dibawa oleh pengecualian, kapan setiap kode error terjadi, dan apa yang harus dilakukan aplikasi Anda terkait hal tersebut.

Halaman ini mengasumsikan bahwa Anda telah mengintegrasikan Firebase PNV seperti yang dijelaskan dalam Memulai Firebase Phone Number Verification di Android.

Cara error dilaporkan

  • Metode asinkron (getVerificationSupportInfo(), getVerifiedPhoneNumber(), dan metode alur kustom) menampilkan Task. Jika gagal, Task akan gagal dengan FirebasePhoneNumberVerificationException, yang Anda terima di addOnFailureListener.

  • enableTestSession() bersifat sinkron. Pengecualian FirebasePhoneNumberVerificationException akan langsung ditampilkan.

Baca errorCode pengecualian untuk mengetahui penyebab masalahnya. Kode Firebase PNV adalah konstanta dalam class FirebasePnvStatusCodes. Jika kegagalan berasal dari layanan Google Play, errorCode juga dapat berupa nilai CommonStatusCodes, seperti NETWORK_ERROR.

Perangkat atau SIM yang tidak didukung bukanlah error. getVerificationSupportInfo() berhasil dan melaporkan isSupported() sebagai false untuk SIM tersebut, dan getReason() memberi tahu Anda alasannya. Lihat Perangkat dan SIM yang tidak didukung.

Kode error

Penyiapan sesi pengujian

Error ini ditampilkan secara sinkron oleh enableTestSession().

Kode error Penyebab Tindakan yang disarankan
TEST_SESSION_ALREADY_ENABLED
(55508)
enableTestSession() dipanggil lebih dari sekali dalam proses aplikasi yang sama. FirebasePhoneNumberVerification.getInstance() menampilkan instance yang sama setiap kali, sehingga hal ini juga terjadi saat Activity yang memanggilnya dibuat ulang. Panggil enableTestSession() sekali per proses, misalnya di Application.onCreate(). Lihat Melakukan inisialisasi library dalam mode pengujian.
INVALID_TEST_NUMBER_ID
(55507)
Token pengujian yang diteruskan ke enableTestSession() kosong. Pastikan build Anda meneruskan token yang Anda buat di Firebase console, dan hanya panggil enableTestSession() jika token tidak kosong.

Verifikasi

Error ini menggagalkan Task yang ditampilkan oleh getVerifiedPhoneNumber().

Kode error Penyebab Tindakan yang disarankan
CREDENTIAL_MANAGER_ERROR
(55506)
Credential Manager Android tidak menampilkan nomor telepon. Jika cause pengecualian adalah GetCredentialCancellationException, kemungkinan besar pengguna menutup layar izin. Tawarkan cara lain untuk memverifikasi nomor telepon, seperti SMS. Jangan mencoba lagi secara otomatis, karena pengguna akan melihat layar izin lagi.
CARRIER_NOT_SUPPORTED
(55501)
Operator SIM yang dipilih tidak didukung, atau perangkat tidak memiliki informasi langganan yang diperlukan untuk memverifikasinya. Gunakan metode verifikasi lain, seperti SMS.
UNSUPPORTED_OPERATION
(55505)
Firebase PNV tidak tersedia untuk permintaan ini di perangkat. Gunakan metode verifikasi lain, seperti SMS.
PREFLIGHT_CHECK_FAILED
(55504)
Backend Firebase PNV tidak dapat membuat permintaan verifikasi, sebelum layar izin ditampilkan. Gunakan metode verifikasi lain, seperti SMS. Jika hal ini terjadi untuk setiap permintaan, pastikan aplikasi Anda disiapkan dengan benar (lihat Mengupgrade ke mode produksi).
INTEGRITY_CHECK_FAILED
(55503)
Perangkat atau aplikasi gagal dalam pemeriksaan integritas. Gunakan metode verifikasi lain, seperti SMS.
INVALID_DIGITAL_CREDENTIAL_RESPONSE
(55502)
Respons dari Credential Manager tidak dapat dibaca, atau tidak dapat ditukar dengan nomor telepon terverifikasi. Gunakan metode verifikasi lain, seperti SMS.
INVALID_TEST_NUMBER_ID
(55507)
Dalam mode pengujian, backend Firebase PNV menolak token pengujian, misalnya karena masa berlakunya telah habis. Token pengujian memiliki TTL 7 hari. Token pengujian yang ditolak biasanya melaporkan kode ini; jika Anda melihat error lain dalam mode pengujian, periksa juga apakah token Anda sudah yang terbaru. Buat token pengujian baru di Firebase console dan build ulang aplikasi Anda.
ACTIVITY_CONTEXT_REQUIRED
(55509)
Context yang diteruskan ke getVerifiedPhoneNumber() bukanlah Activity. Metode ini memerlukan Activity untuk menampilkan layar izin. Teruskan Activity saat ini. Ini adalah bug di aplikasi Anda, bukan kondisi yang harus ditangani saat runtime.

Pemeriksaan dukungan

Task yang ditampilkan oleh getVerificationSupportInfo() hanya gagal jika pemeriksaan itu sendiri tidak dapat dijalankan. Dalam hal ini, errorCode adalah nilai CommonStatusCodes layanan Google Play atau CARRIER_NOT_SUPPORTED. Perlakukan perangkat sebagai tidak didukung dan beralih ke metode verifikasi lain, seperti SMS.

Saat sesi pengujian diaktifkan, getVerificationSupportInfo() tidak akan menghubungi backend Firebase PNV dan selalu melaporkan SIM pengujian sebagai didukung, meskipun token pengujian telah habis masa berlakunya.

Alur kustom

Jika Anda menggunakan alur kustom, bukan getVerifiedPhoneNumber():

  • getDigitalCredentialPayload() gagal dengan PREFLIGHT_CHECK_FAILED, atau dengan INVALID_TEST_NUMBER_ID jika backend menolak token pengujian Anda.
  • exchangeCredentialResponseForPhoneNumber() gagal dengan INVALID_DIGITAL_CREDENTIAL_RESPONSE, atau dengan INVALID_TEST_NUMBER_ID jika backend menolak token pengujian Anda.
  • Panggilan Anda sendiri ke Credential Manager menampilkan GetCredentialException, yang Anda tangani secara langsung.

Perangkat dan SIM yang tidak didukung

Jika isSupported() adalah false untuk SIM, getReason() akan menampilkan salah satu nilai VerificationSupportStatus berikut:

Nilai Arti
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED Operator SIM tidak didukung. Lihat Operator yang didukung.
INCAPABLE_DUE_TO_ANDROID_VERSION Perangkat menjalankan versi Android yang lebih lama dari Android 9 (level API 28).
INCAPABLE_DUE_TO_SIM_STATE SIM belum siap. SIM yang terkunci atau masih dimuat juga dapat melaporkan INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED, karena operator diperiksa terlebih dahulu.

Dalam setiap kasus, gunakan metode verifikasi lain, seperti SMS, untuk SIM tersebut.

Contoh

Contoh berikut menangani error yang perlu dibedakan oleh aplikasi standar saat memanggil 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()
        }
    }
}

Dalam contoh ini, showSmsVerification() adalah alur verifikasi nomor telepon yang ada di aplikasi Anda.

Langkah berikutnya