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

Firebase认证报错:FirebaseAuthInvalidCredentialsException(邮箱格式错误)

解决Firebase注册页面的「邮箱格式不正确」崩溃问题

从你给出的错误栈信息来看,崩溃的根源是FirebaseAuthInvalidCredentialsException: 邮箱格式不正确——这个异常是Firebase在校验邮箱格式时抛出的,但你的代码没有提前做格式校验,也没有处理API调用失败的情况,直接去获取task.getResult()才导致了RuntimeExecutionException。

你的代码存在的问题

  1. 缺少邮箱格式前置校验:在调用fetchSignInMethodsForEmail和createUserWithEmailAndPassword之前,没有先检查用户输入的邮箱是否符合标准格式,导致无效邮箱直接传给Firebase API触发异常。
  2. 未处理API调用失败的情况:在fetchSignInMethodsForEmail的onComplete回调里,你直接调用task.getResult(),但如果API调用失败(比如格式错误),task.isSuccessful()会返回false,此时调用getResult()就会抛出运行时异常。

修复方案

1. 先添加邮箱格式校验方法

可以用Android自带的邮箱校验工具,简单又可靠:

import android.util.Patterns;

// 校验邮箱格式的工具方法
private boolean isValidEmail(String email) {
    // 先判空,再做格式校验
    return email != null && !email.trim().isEmpty() 
        && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

2. 修改compareData方法,完善校验和异常处理

在调用任何Firebase API之前先做本地校验,同时在回调里先判断任务是否成功,再处理结果:

private void compareData() {
    String userEmail = newEmail.getText().toString().trim();
    String userPassword = newPassword.getText().toString().trim();

    // 第一步:本地校验邮箱格式
    if (!isValidEmail(userEmail)) {
        Toast.makeText(RegistrationActivity.this, "请输入正确的邮箱格式", Toast.LENGTH_SHORT).show();
        return;
    }

    // 第二步:可选,校验密码长度(Firebase要求密码至少6位)
    if (userPassword.length() < 6) {
        Toast.makeText(RegistrationActivity.this, "密码长度不能少于6位", Toast.LENGTH_SHORT).show();
        return;
    }

    // 第三步:检查邮箱是否已注册
    firebaseAuth.fetchSignInMethodsForEmail(userEmail).addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
        @Override
        public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
            // 先判断API调用是否成功,避免抛出异常
            if (task.isSuccessful()) {
                boolean isEmailRegistered = !task.getResult().getSignInMethods().isEmpty();
                if (!isEmailRegistered) {
                    // 执行注册逻辑
                    firebaseAuth.createUserWithEmailAndPassword(userEmail, userPassword)
                        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(RegistrationActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                                    startActivity(new Intent(RegistrationActivity.this, MainActivity.class));
                                    finish(); // 结束注册页,避免用户返回重复操作
                                } else {
                                    // 显示具体的注册失败原因,让用户更清楚问题
                                    String errorMsg = task.getException() != null 
                                        ? task.getException().getMessage() 
                                        : "注册失败,请稍后重试";
                                    Toast.makeText(RegistrationActivity.this, errorMsg, Toast.LENGTH_SHORT).show();
                                }
                            }
                        });
                } else {
                    Toast.makeText(RegistrationActivity.this, "该邮箱已被注册", Toast.LENGTH_SHORT).show();
                }
            } else {
                // 处理邮箱检查失败的情况
                String errorMsg = task.getException() != null 
                    ? task.getException().getMessage() 
                    : "无法检查邮箱状态,请稍后重试";
                Toast.makeText(RegistrationActivity.this, errorMsg, Toast.LENGTH_SHORT).show();
            }
        }
    });
}

3. 额外优化建议

  • 给邮箱输入框设置android:inputType="textEmailAddress",系统会自动适配邮箱输入键盘,并且在输入时做基础格式提示;
  • 添加按钮点击防抖,比如在点击注册按钮后禁用按钮,直到API回调返回,避免用户重复点击触发多次请求。

这样修改后,不仅能避免格式错误导致的崩溃,还能给用户更清晰的操作提示,整个注册流程也会更健壮。

内容的提问来源于stack exchange,提问作者Arpan Mohanty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:19:26