You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase手机号认证异常:点击验证后无短信且弹出Toast

解决Firebase手机号验证无响应、未收到短信的问题

从你描述的现象和提供的代码来看,这个问题大概率和Firebase验证流程的配置细节、代码逻辑疏漏有关,我来帮你一步步排查修复:

1. 先搞懂为什么会打开浏览器

点击验证后弹出浏览器,是因为Firebase Phone Auth触发了reCAPTCHA验证,通常触发这个的原因有这些:

  • 测试设备没有安装/启用Google Play服务(或版本过低)
  • 你在Firebase控制台配置的SHA-1/SHA-256指纹不完整(比如漏加了debug环境的指纹)
  • 应用包名和Firebase控制台注册的包名不一致

你提到已经配置了SHA指纹,建议再仔细核对:

  • 确保同时添加了debug和release两种环境的SHA指纹(测试阶段debug指纹是必须的)
  • 检查Firebase控制台「项目设置」里的应用包名,和你AndroidManifest.xml里的包名完全一致

2. 优化代码里的验证逻辑

看你的代码,有几个细节可以调整,避免流程卡住:

(1)精准捕获验证失败的错误类型

当前你只是直接Toast异常信息,建议细化错误判断,方便定位问题:

@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
    String errorMsg;
    if (e instanceof FirebaseAuthInvalidCredentialsException) {
        errorMsg = "无效的手机号格式,请检查输入";
    } else if (e instanceof FirebaseTooManyRequestsException) {
        errorMsg = "请求过于频繁,请稍后再试";
    } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
        errorMsg = "需要reCAPTCHA验证,请确保浏览器正常工作";
    } else {
        errorMsg = e.getMessage();
    }
    Toast.makeText(PhoneSingUp.this, errorMsg, Toast.LENGTH_LONG).show();
    // 验证失败后恢复UI状态,避免一直显示加载
    VerifyingTXT.setVisibility(View.INVISIBLE);
}

(2)修正自动验证的逻辑

onVerificationCompleted会在部分设备上自动完成验证(无需输入验证码),你的代码里手动提取验证码的逻辑没必要,直接用凭据登录即可:

@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
    // 自动验证通过,直接登录
    signInWithPhoneAuthCredential(phoneAuthCredential);
    VerifySuccess.setVisibility(View.VISIBLE);
    // 登录成功后可以直接跳转到主页面
    startActivity(new Intent(PhoneSingUp.this, MainActivity.class));
    finish();
}

(3)完善手机号格式校验

你当前只判断长度是否为13位,这个逻辑太局限(不同国家手机号长度不同),建议增加基础校验:

UserEnteredNumber = NumberEnt.getText().toString().trim();
// 先判断是否为空或非数字
if (TextUtils.isEmpty(UserEnteredNumber) || !TextUtils.isDigitsOnly(UserEnteredNumber)) {
    ErrorTXT.setText("请输入有效的手机号");
    ErrorTXT.setVisibility(View.VISIBLE);
    return;
}
PhoneNumber = "+" + CountryCodeS + UserEnteredNumber;
// 再做通用长度校验(大部分国家手机号在+号后是10-15位)
if (PhoneNumber.length() < 10 || PhoneNumber.length() > 15) {
    ErrorTXT.setText("手机号长度不正确,请检查");
    ErrorTXT.setVisibility(View.VISIBLE);
    VerifyingTXT.setVisibility(View.INVISIBLE);
} else {
    // 启动验证流程
    ErrorTXT.setVisibility(View.GONE);
    VerifyingTXT.setVisibility(View.VISIBLE);
    sendVerificationCode(PhoneNumber);
}

3. 检查Firebase控制台的基础配置

  • 确认在Firebase控制台「Authentication -> 登录方式」中,已经启用了手机号登录选项
  • 检查google-services.json是否是最新版本:如果修改过SHA指纹或包名,需要重新从Firebase控制台下载并替换到项目中

4. 测试环境的注意事项

  • 尽量用真机测试,部分模拟器没有Google Play服务,会导致reCAPTCHA验证无法完成;如果用模拟器,选择带Google Play的镜像
  • 确保测试设备能正常接收短信,也可以到Firebase控制台「Authentication -> 日志」里查看短信发送的状态,排查是否是发送环节出了问题

按照上面的步骤逐一排查调整,应该能解决你遇到的无响应、收不到短信的问题。

内容的提问来源于stack exchange,提问作者Mahmoud Al Marashdy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:27:42