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

Firebase Google登录弹窗后中止、邮箱登录失败及OTP过期问题求助

问题解决方案

一、邮箱登录无法完成的修复

你的邮箱登录逻辑存在输入判断错误:在fillForm函数中,判断输入是否为空时,错误调用了EditText.toString()而非EditText.text.toString()。EditText.toString()返回的是控件的对象字符串(如android.widget.EditText@xxxx),永远不会为空,导致即使用户输入了内容,也会触发空输入提示,无法进入登录流程。

修复代码:

private fun fillForm() {
    binding.btnSignIn.setOnClickListener {
        binding.barEmailSignIn.visibility=View.VISIBLE
        // 保留隐藏其他按钮的逻辑
        
        // 修正:获取输入框文本用text.toString()并去除首尾空格
        val email = binding.editEmailTxt.text.toString().trim()
        val password = binding.editPasswordTxt.text.toString().trim()
        
        if (email.isEmpty()) {
            Toast.makeText(requireActivity(), "请输入邮箱地址", Toast.LENGTH_SHORT).show()
            // 保留恢复按钮可见性的逻辑
        } else if (password.isEmpty()) {
            Toast.makeText(requireActivity(), "请输入密码", Toast.LENGTH_SHORT).show()
            // 保留恢复按钮可见性的逻辑
        } else {
            signInWithEmailAndPassword(email, password)
        }
    }
}

二、Google登录弹出账号选择后中止的排查与修复

1. 补充结果回调的异常处理

当前代码仅处理了RESULT_OK的情况,用户取消登录或出现异常时无任何日志输出,导致无法定位问题。修改launcher回调逻辑,覆盖所有结果状态:

private val launcher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        when(result.resultCode) {
            Activity.RESULT_OK -> {
                val task = GoogleSignIn.getSignedInAccountFromIntent(result.data)
                handlerResults(task)
            }
            Activity.RESULT_CANCELED -> {
                Log.d("GoogleSignIn", "用户取消登录")
                Toast.makeText(requireActivity(), "登录已取消", Toast.LENGTH_SHORT).show()
            }
            else -> {
                Log.d("GoogleSignIn", "登录结果异常:${result.resultCode}")
            }
        }
    }

2. 检查基础配置

  • 确认Firebase控制台已启用Google登录(Authentication > Sign-in method > Google > 启用)。
  • 验证default_web_client_id是否正确:该值来自google-services.json文件,需确保文件已正确放置在app目录下,且SHA-1指纹已添加到Firebase项目设置中。
  • 检查依赖完整性,确保build.gradle中包含以下依赖:
    implementation 'com.google.firebase:firebase-auth-ktx:22.0.0'
    implementation 'com.google.android.gms:play-services-auth:20.7.0'
    

三、OTP登录验证码过期的处理

报错FirebaseAuthInvalidCredentialsException: The sms code has expired表示验证码已超时,需做以下处理:

  1. 在验证码验证逻辑中捕获该异常,提示用户重新发送验证码:
    // OTP验证代码示例
    mAuth.signInWithCredential(PhoneAuthProvider.getCredential(verificationId, otpCode))
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                // 登录成功跳转逻辑
            } else {
                val exception = task.exception
                if (exception is FirebaseAuthInvalidCredentialsException) {
                    if (exception.message?.contains("expired") == true) {
                        Toast.makeText(requireActivity(), "验证码已过期,请重新获取", Toast.LENGTH_SHORT).show()
                        // 触发重新发送验证码的逻辑
                    } else {
                        Toast.makeText(requireActivity(), "验证码无效", Toast.LENGTH_SHORT).show()
                    }
                } else {
                    Toast.makeText(requireActivity(), "登录失败:${exception?.message}", Toast.LENGTH_SHORT).show()
                }
            }
        }
    
  2. 优化用户提示:发送验证码后添加倒计时,告知用户验证码有效期(Firebase默认5分钟)。
  3. 添加防重复发送控制:设置按钮状态,避免用户频繁点击发送验证码按钮。

内容的提问来源于stack exchange,提问作者Lakshay Kadam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:07:09