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表示验证码已超时,需做以下处理:
- 在验证码验证逻辑中捕获该异常,提示用户重新发送验证码:
// 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() } } } - 优化用户提示:发送验证码后添加倒计时,告知用户验证码有效期(Firebase默认5分钟)。
- 添加防重复发送控制:设置按钮状态,避免用户频繁点击发送验证码按钮。
内容的提问来源于stack exchange,提问作者Lakshay Kadam
相关产品推荐
相关产品推荐

