使用Firebase Auth的Google One Tap登录抛出GetCredentialException异常求助
问题排查与解决方案
1. 修复协程执行顺序问题
你的signIn()方法中,showLoading(false)直接写在协程代码块外,会导致登录请求还在处理时就提前关闭加载状态,虽不直接触发取消异常,但可能干扰流程逻辑。将其移至try-catch的finally块,确保无论登录成功或失败都能正确处理加载状态:
private fun signIn() { val credentialManager = CredentialManager.create(this) val googleIdOption = GetSignInWithGoogleOption.Builder(BuildConfig.WEB_CLIENT_ID) .build() val request = GetCredentialRequest.Builder() .addCredentialOption(googleIdOption) .build() lifecycleScope.launch { try { val result: GetCredentialResponse = credentialManager.getCredential( request = request, context = this@LoginActivity, ) handleSignIn(result) } catch (e: GetCredentialException) { Log.d("Error", e.message.toString()) } finally { showLoading(false) // 移至finally块保证执行时机 } } }
2. 移除干扰性Window Flag
你在onCreate中设置的FLAG_LAYOUT_NO_LIMITS会让Activity布局忽略系统栏限制,可能导致Google One Tap弹窗无法正确识别Activity生命周期状态,进而误判为用户取消操作。尝试注释或删除这段代码:
// 注释或删除以下两行 // window.setFlags( // WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, // WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS // )
3. 对比新项目配置找差异
由于新项目能正常运行,重点核对以下配置项:
- SHA-1指纹:确保当前项目在Firebase控制台添加了正确的调试/发布环境SHA-1指纹,Google One Tap依赖该信息验证应用身份。
- Web Client ID:确认
BuildConfig.WEB_CLIENT_ID与新项目一致,且是Firebase控制台中配置的Web类型Client ID,不要混用Android Client ID。 - 依赖版本:保持当前项目的
CredentialManager、Firebase Auth等依赖版本与新项目一致,示例依赖如下:implementation "androidx.credentials:credentials:1.2.2" implementation "androidx.credentials:credentials-play-services-auth:1.2.2" implementation "com.google.firebase:firebase-auth:22.3.1" - Activity启动模式:检查
LoginActivity的launchMode是否为standard(默认值),避免使用singleInstance或singleTask这类可能干扰弹窗生命周期的模式。
4. 清除本地缓存数据
本地缓存的账号信息或应用状态异常可能触发该问题,尝试:
- 清除当前应用的缓存和存储数据
- 在系统设置中移除Google账号后重新添加,再测试登录流程
内容的提问来源于stack exchange,提问作者Wisnu
相关产品推荐
相关产品推荐

