Firebase手机号认证遇FirebaseAuthInvalidCredentialsException:号码格式错误
解决Firebase手机号认证格式错误问题
核心问题定位
你代码里获取手机号的方式完全错误:
mPhoneNumber = mBinding.registerInputPhoneNumber.toString();
registerInputPhoneNumber是EditText控件,调用toString()得到的是控件的对象描述(比如android.widget.EditText@xxxxxx),根本不是用户输入的号码,这直接导致Firebase收到的内容完全不符合E.164格式,触发错误。
分步解决方案
修正手机号获取逻辑
替换成获取EditText的输入文本,同时去除首尾空格:mPhoneNumber = mBinding.registerInputPhoneNumber.text.toString().trim()确保手机号严格符合E.164格式
- 必须以
+开头,紧跟国家码(比如中国是+86),后面是纯数字的手机号,不能包含空格、括号、横杠等符号 - 示例正确格式:
+8613800138000 - 可以在代码里做格式校验,自动补全国家码并清理无效字符:
// 假设默认国家码是+86,根据需求调整 if (!mPhoneNumber.startsWith("+")) { mPhoneNumber = "+86$mPhoneNumber" } // 移除所有非数字字符(除了开头的+) mPhoneNumber = mPhoneNumber.replace(Regex("[^+0-9]"), "")
- 必须以
修正依赖文件的语法错误
你的build.gradle里firestore依赖少了闭合引号,修正后:implementation "com.google.firebase:firebase-auth:21.1.0" implementation "com.google.firebase:firebase-auth-ktx:21.1.0" implementation 'com.google.firebase:firebase-firestore:24.4.5'额外验证步骤
- 在调用
PhoneAuthProvider.verifyPhoneNumber之前,打印mPhoneNumber的值,确认是正确的E.164格式 - 确保测试用的是真实有效的手机号,并且在真机上运行(模拟器可能无法接收短信)
- 在调用
修正后的完整authUser函数示例
private fun authUser(){ // 获取输入文本并清理格式 val rawInput = mBinding.registerInputPhoneNumber.text.toString().trim() // 处理成E.164格式(以中国为例) mPhoneNumber = if (rawInput.startsWith("+")) { rawInput.replace(Regex("[^+0-9]"), "") } else { "+86${rawInput.replace(Regex("[^0-9]"), "")}" } // 打印验证格式 Log.d(TAG, "处理后的手机号: $mPhoneNumber") val mPhoneNumberOptions = PhoneAuthOptions.newBuilder() .setPhoneNumber(mPhoneNumber) .setActivity(activity as RegisterActivity) .setTimeout(60L, TimeUnit.SECONDS) .setCallbacks(mCallBack) .build() PhoneAuthProvider.verifyPhoneNumber(mPhoneNumberOptions) }
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

