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
相关产品推荐
相关产品推荐

