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

Firebase手机验证问题:代码无报错但验证失败求助

解决Firebase手机验证失败的问题

看起来你已经完成了基础配置,但还是遇到了验证失败的问题,我帮你梳理几个代码和配置层面的潜在问题,应该能解决你的困扰:

一、代码层面的修复建议

1. 手机号格式是核心问题

Firebase的verifyPhoneNumber要求传入带国际国家码的完整手机号(比如+86138xxxxxxxxx),你当前的代码直接读取用户输入的手机号,没有处理国家码,这大概率是验证失败的主要原因。

修改GetCode方法,先处理手机号格式:

public void GetCode(View view) {
    String rawPhone = phone.getText().toString().trim();
    // 补全国家码(这里以中国为例,根据你的用户群体调整)
    String phoneNumber = rawPhone.startsWith("+") ? rawPhone : "+86" + rawPhone;
    
    // 先校验格式合法性
    if (!Patterns.PHONE.matcher(phoneNumber).matches()) {
        phone.setError("请输入有效的手机号");
        return;
    }
    
    PhoneAuthProvider.getInstance().verifyPhoneNumber(
        phoneNumber,
        60,
        TimeUnit.SECONDS,
        this,
        mCallbacks
    );
    
    // 调整UI
    phone.setVisibility(View.GONE);
    getcode.setVisibility(View.GONE);
    vcode.setVisibility(View.VISIBLE);
    verify.setVisibility(View.VISIBLE);
}

2. 完善错误日志,方便排查

你当前的onVerificationFailed只显示了模糊的"Login Failed",根本没法定位具体问题。建议添加详细的错误提示和日志:

@Override
public void onVerificationFailed(FirebaseException e) {
    String errorMsg;
    if (e instanceof FirebaseAuthInvalidCredentialsException) {
        errorMsg = "手机号格式不正确";
        phone.setError(errorMsg);
    } else if (e instanceof FirebaseTooManyRequestsException) {
        errorMsg = "请求过于频繁,请稍后再试";
    } else {
        errorMsg = "验证失败: " + e.getMessage();
    }
    
    Toast.makeText(MainActivity.this, errorMsg, Toast.LENGTH_LONG).show();
    Log.e("PhoneAuthError", "验证失败详情", e); // 打印到Logcat,方便你看具体错误
    
    // 验证失败后恢复UI,让用户可以重新输入
    phone.setVisibility(View.VISIBLE);
    getcode.setVisibility(View.VISIBLE);
    vcode.setVisibility(View.GONE);
    verify.setVisibility(View.GONE);
}

3. 修复登录成功后的跳转逻辑

你现在在登录成功后跳回MainActivity本身,还调用了finish(),这会导致页面重启,逻辑明显有问题。应该跳转到你的目标主页(比如Main2Activity,不过看你的Main2Activity是跳转到MainActivity的,可能你搞反了页面逻辑,建议调整):

@Override
public void onComplete(@NonNull Task<AuthResult> task) {
    if (task.isSuccessful()) {
        FirebaseUser user = task.getResult().getUser();
        Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
        // 跳转到真正的主页,比如Main2Activity
        startActivity(new Intent(MainActivity.this, Main2Activity.class));
        finish();
    } else {
        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
            Toast.makeText(MainActivity.this, "验证码无效", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(MainActivity.this, "登录失败: " + task.getException().getMessage(), Toast.LENGTH_LONG).show();
        }
    }
}

二、配置层面的排查点

即使代码没问题,配置疏漏也会导致验证失败:

  • 确认SHA证书是否完整配置:不要只配置debug的SHA1,如果你用release包测试,必须添加release的SHA1。可以通过命令keytool -list -v -keystore 你的密钥库路径获取正确的SHA值,然后在Firebase控制台的「项目设置」-「应用」里更新。
  • 检查Firebase控制台的手机验证设置:确保已经开启了「电话号码」登录方式,并且如果是特定地区(比如印度),需要完成短信服务商的配置。另外,测试阶段可以添加测试手机号(在Firebase控制台的「身份验证」-「登录方式」-「电话号码」里设置),避免被短信限流。
  • 确认网络权限:在AndroidManifest.xml里必须添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />

最后测试建议

先使用Firebase控制台添加的测试手机号进行测试,这样可以排除短信发送的问题。同时查看Logcat里的错误日志,这是定位问题最直接的方式。

内容的提问来源于stack exchange,提问作者Kothuri Keerthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:30:26