Khi lệnh gọi đến thư viện Firebase PNV không thành công, thư viện sẽ báo cáo FirebasePhoneNumberVerificationException.
Trang này liệt kê mọi mã lỗi mà ngoại lệ có thể mang theo, thời điểm xảy ra từng mã lỗi và những việc ứng dụng của bạn nên làm.
Trang này giả định rằng bạn đã tích hợp Firebase PNV như mô tả trong phần Bắt đầu sử dụng Firebase Phone Number Verification trên Android.
Cách báo cáo lỗi
Các phương thức không đồng bộ (
getVerificationSupportInfo(),getVerifiedPhoneNumber()và các phương thức quy trình tuỳ chỉnh) trả về mộtTask. Khi các lệnh này không thành công,Tasksẽ không thành công kèm theoFirebasePhoneNumberVerificationExceptionmà bạn nhận được trongaddOnFailureListener.enableTestSession()có tính đồng bộ. Thao tác này sẽ trực tiếp tạo mộtFirebasePhoneNumberVerificationException.
Đọc errorCode của ngoại lệ để tìm hiểu xem có vấn đề gì. Mã Firebase PNV là hằng số trong lớp FirebasePnvStatusCodes. Nếu lỗi là do Dịch vụ Google Play, thì errorCode cũng có thể là một giá trị CommonStatusCodes, chẳng hạn như NETWORK_ERROR.
Thiết bị hoặc SIM không được hỗ trợ không phải là lỗi. getVerificationSupportInfo()
thành công và báo cáo isSupported() là false cho SIM đó, còn getReason()
cho bạn biết lý do. Xem Thiết bị và SIM không được hỗ trợ.
Mã lỗi
Thiết lập phiên kiểm thử
enableTestSession() sẽ gửi các lỗi này một cách đồng bộ.
| Mã lỗi | Nguyên nhân | Hành động được đề xuất |
|---|---|---|
TEST_SESSION_ALREADY_ENABLED(55508) |
enableTestSession() đã được gọi nhiều lần trong cùng một
quy trình ứng dụng. FirebasePhoneNumberVerification.getInstance()
trả về cùng một thực thể mỗi lần, vì vậy, điều này cũng xảy ra khi một
Activity gọi nó được tạo lại. |
Gọi enableTestSession() một lần cho mỗi quy trình, ví dụ: trong Application.onCreate(). Xem phần Khởi chạy thư viện ở chế độ thử nghiệm. |
INVALID_TEST_NUMBER_ID(55507) |
Mã thông báo kiểm thử được truyền đến enableTestSession() đang trống. |
Đảm bảo bản dựng của bạn truyền mã thông báo mà bạn đã tạo trong bảng điều khiển Firebase và chỉ gọi enableTestSession() khi mã thông báo không trống. |
Xác minh
Những lỗi này khiến Task do getVerifiedPhoneNumber() trả về không thành công.
| Mã lỗi | Nguyên nhân | Hành động được đề xuất |
|---|---|---|
CREDENTIAL_MANAGER_ERROR(55506) |
Trình quản lý thông tin xác thực Android không trả về số điện thoại. Nếu cause của ngoại lệ là GetCredentialCancellationException, thì nhiều khả năng người dùng đã đóng màn hình xin phép. |
Cung cấp một cách khác để xác minh số điện thoại, chẳng hạn như qua tin nhắn SMS. Đừng thử lại tự động vì người dùng sẽ thấy lại màn hình xin phép. |
CARRIER_NOT_SUPPORTED(55501) |
Nhà mạng của SIM đã chọn không được hỗ trợ hoặc thiết bị không có thông tin gói thuê bao cần thiết để xác minh SIM đó. | Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS. |
UNSUPPORTED_OPERATION(55505) |
Firebase PNV không dùng được cho yêu cầu này trên thiết bị. | Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS. |
PREFLIGHT_CHECK_FAILED(55504) |
Phần phụ trợ Firebase PNV không thể tạo yêu cầu xác minh trước khi màn hình xin phép được hiển thị. | Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS. Nếu lỗi này xảy ra với mọi yêu cầu, hãy kiểm tra để đảm bảo rằng ứng dụng của bạn được thiết lập đúng cách (xem phần Nâng cấp lên chế độ sản xuất). |
INTEGRITY_CHECK_FAILED(55503) |
Thiết bị hoặc ứng dụng không vượt qua được quy trình kiểm tra tính toàn vẹn. | Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS. |
INVALID_DIGITAL_CREDENTIAL_RESPONSE(55502) |
Không thể đọc phản hồi từ Trình quản lý thông tin xác thực hoặc không thể đổi lấy số điện thoại đã xác minh. | Chuyển sang một phương thức xác minh khác, chẳng hạn như SMS. |
INVALID_TEST_NUMBER_ID(55507) |
Ở chế độ thử nghiệm, phần phụ trợ Firebase PNV đã từ chối mã thông báo thử nghiệm, ví dụ: vì mã thông báo đã hết hạn. Mã thông báo thử nghiệm có TTL là 7 ngày. Mã thông báo thử nghiệm bị từ chối thường báo cáo mã này; nếu bạn thấy các lỗi khác ở chế độ thử nghiệm, hãy kiểm tra để đảm bảo mã thông báo của bạn là mã thông báo hiện tại. | Tạo mã thông báo kiểm thử mới trong bảng điều khiển Firebase rồi tạo lại ứng dụng. |
ACTIVITY_CONTEXT_REQUIRED(55509) |
Context được truyền đến getVerifiedPhoneNumber() không phải là Activity. Phương thức này cần có một Activity để
hiển thị màn hình xin phép. |
Truyền Activity hiện tại. Đây là lỗi trong ứng dụng của bạn, không phải là điều kiện để xử lý trong thời gian chạy. |
Kiểm tra khả năng hỗ trợ
Task do getVerificationSupportInfo() trả về chỉ không thành công nếu bản thân quy trình kiểm tra không thể chạy. Trong trường hợp đó, errorCode là giá trị CommonStatusCodes của Dịch vụ Google Play hoặc CARRIER_NOT_SUPPORTED. Coi thiết bị là không được hỗ trợ và quay lại một phương thức xác minh khác, chẳng hạn như SMS.
Khi một phiên kiểm thử được bật, getVerificationSupportInfo() sẽ không liên hệ với phần phụ trợ Firebase PNV và luôn báo cáo SIM kiểm thử là được hỗ trợ, ngay cả khi mã thông báo kiểm thử đã hết hạn.
Quy trình tuỳ chỉnh
Nếu bạn sử dụng quy trình tuỳ chỉnh thay vì getVerifiedPhoneNumber():
getDigitalCredentialPayload()không thành công vớiPREFLIGHT_CHECK_FAILEDhoặc vớiINVALID_TEST_NUMBER_IDnếu phần phụ trợ từ chối mã thông báo kiểm thử của bạn.exchangeCredentialResponseForPhoneNumber()không thành công vớiINVALID_DIGITAL_CREDENTIAL_RESPONSEhoặc vớiINVALID_TEST_NUMBER_IDnếu phần phụ trợ từ chối mã thông báo kiểm thử của bạn.- Lệnh gọi của riêng bạn đến Trình quản lý thông tin xác thực sẽ gửi một
GetCredentialExceptionmà bạn xử lý trực tiếp.
Thiết bị và SIM không được hỗ trợ
Khi isSupported() là false cho một SIM, getReason() sẽ trả về một trong các giá trị
VerificationSupportStatus
sau:
| Giá trị | Ý nghĩa |
|---|---|
INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED |
Nhà mạng của SIM không được hỗ trợ. Xem Nhà mạng được hỗ trợ. |
INCAPABLE_DUE_TO_ANDROID_VERSION |
Thiết bị chạy phiên bản Android cũ hơn Android 9 (cấp độ API 28). |
INCAPABLE_DUE_TO_SIM_STATE |
SIM chưa sẵn sàng. SIM bị khoá hoặc vẫn đang tải cũng có thể báo cáo INCAPABLE_DUE_TO_CARRIER_UNSUPPORTED, vì nhà mạng được kiểm tra trước tiên. |
Trong mỗi trường hợp, hãy sử dụng một phương thức xác minh khác, chẳng hạn như SMS, cho SIM đó.
Ví dụ
Ví dụ sau đây xử lý các lỗi mà một ứng dụng thông thường cần phân biệt khi gọi 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()
}
}
}
Trong ví dụ này, showSmsVerification() là quy trình xác minh số điện thoại hiện có của ứng dụng.
Các bước tiếp theo
- Để biết thông tin chi tiết về từng lớp và hằng số, hãy xem Tài liệu tham khảo API Firebase PNV.
- Để xác minh mã thông báo trên máy chủ, hãy xem bài viết Xác minh mã thông báo Firebase PNV.