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

Google Credential Manager弹窗不显示问题求助

问题

我正在应用中集成新版Google Credential Manager,但用户选择账号的弹窗始终无法弹出,无任何报错或警告信息,查看日志发现流程仅停留在“launching credentialManager”。我已按照文档完成所有OAuth及ClientID配置,也尝试使用credentialManager.getCredentialAsync方法,但均无效果。此前应用使用旧版Google SignIn方法时功能完全正常。

相关代码如下:

class IntroTestActivity : AppCompatActivity() {
private lateinit var b: ActivityIntroTestBinding
private lateinit var credentialManager: CredentialManager

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    b = ActivityIntroTestBinding.inflate(layoutInflater)
    setContentView(b.root)

    credentialManager = CredentialManager.create(this)

    b.introImage.setOnClickListener {
        initializeGoogleSignIn()
    }
}

private fun initializeGoogleSignIn() {
    Log.d("errorTag", "initializeGoogleSignIn")
    val rawNonce = UUID.randomUUID().toString()
    val bytes = rawNonce.toByteArray()
    val md = MessageDigest.getInstance("SHA-256")
    val digest = md.digest(bytes)
    val hashedNonce = digest.fold("") {str, it -> str + "%02x".format(it)}
   val googleIdOption = GetGoogleIdOption.Builder()
        .setFilterByAuthorizedAccounts(false)
        .setServerClientId(getString(R.string.default_web_client_id))
       .setNonce(hashedNonce)
        .build()
    Log.d("errorTag", "googleIdOption ${googleIdOption.serverClientId}")
    val request = GetCredentialRequest.Builder()
        .addCredentialOption(googleIdOption)
        .build()
    request.credentialOptions.forEach {
        Log.d("errorTag", "request ${it.type}")
    }

    CoroutineScope(Dispatchers.Main).launch {
        Log.d("errorTag", "launching credentialManager") // -> STOPS HERE!
        try {
            val result = credentialManager.getCredential(request = request, context = this@IntroTestActivity)
            val credential = result.credential
            val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
            val googleIdToken = googleIdTokenCredential.idToken
            CoroutineScope(Dispatchers.Main).launch {
                Toast.makeText(this@IntroTestActivity, "You are signed it! $googleIdToken", Toast.LENGTH_SHORT).show()
            }
        } catch (e: GetCredentialException) {
            Log.d("errorTag", "GetCredentialException error = ${e.message}")
        } catch (e: GoogleIdTokenParsingException) {
            Log.d("errorTag", "GoogleIdTokenParsingException error = ${e.message}")
        } catch (e: Error) {
            Log.d("errorTag", "Other error = ${e.message}")
        }
    }
}
解决方案
  • 核对依赖版本:确保Google Credential Manager相关依赖为最新稳定版,比如com.google.android.libraries.identity.googleid:googleid:x.y.z和com.google.android.libraries.credentials:credentials:x.y.z,版本不匹配可能引发隐性调用失败。
  • 排查Nonce格式问题:临时注释setNonce(hashedNonce)调用,测试弹窗是否弹出。确认Nonce生成逻辑正确——必须是原始随机字符串的SHA-256哈希十六进制表示,长度符合要求。
  • 替换Coroutine作用域:当前使用自定义CoroutineScope,建议改用lifecycleScope,避免作用域提前取消导致调用中断:
    lifecycleScope.launch {
        // 原getCredential调用代码
    }
    
  • 更新Google Play服务:设备上Google Play服务版本过低会导致Credential Manager无法正常工作,确保安装最新版Google Play服务。
  • 重新验证Client ID配置:确认default_web_client_id对应Google Cloud Console中正确创建的Web应用Client ID,且已将应用SHA-1指纹添加至该Client ID的OAuth 2.0配置中,同时确保OAuth consent screen已发布。
  • 扩展异常捕获范围:新增Exception捕获,避免遗漏未定义的异常类型:
    catch (e: Exception) {
        Log.d("errorTag", "General Exception error = ${e.message}, stack trace: ${Log.getStackTraceString(e)}")
    }
    
  • 检查getCredentialAsync用法:若使用异步方法,确保正确处理回调:
    credentialManager.getCredentialAsync(request, this)
        .addOnSuccessListener { result ->
            // 处理登录结果
        }
        .addOnFailureListener { e ->
            Log.d("errorTag", "Async error: ${e.message}")
        }
    

内容的提问来源于stack exchange,提问作者Nicola Salvaro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:35:56