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

使用GoogleId的CredentialManager始终返回“cancelled”异常求助

Compose Credential Manager 抛出 GetCredentialCancellationException 异常问题

问题描述

无论我以何种方式实现Compose Credential Manager,都会抛出异常:GetCredentialCancellationException: activity is canceled by the user.

流程细节:CredentialManager会显示包含我的Google账号的对话框,选择账号后会出现带有“以我身份继续”按钮的授权界面,点击该按钮后立即触发上述异常,目前无法定位问题根源。

依赖库版本

  • androidx.credentials.credentials:credentials:1.2.0-beta03
  • androidx.credentials.credentials:credentials-play-services-auth:1.2.0-beta03
  • com.google.android.gms:play-services-auth:20.7.0

基础演示代码

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        WindowCompat.setDecorFitsSystemWindows(window, false)
        super.onCreate(savedInstanceState)

        lifecycleScope.launch {
            CredentialManager.create(this@MainActivity.applicationContext).getCredential(
                context = this@MainActivity,
                request = GetCredentialRequest(
                    listOf(
                        GetGoogleIdOption.Builder()
                            .setFilterByAuthorizedAccounts(false)
                            .setAutoSelectEnabled(false)
                            .setServerClientId("secret-id")
                            .build(),
                    )
                ),
            ).credential
        }

        setContent {
            Text("DEMO")
        }
    }
}

排查与解决建议

  1. 调整调用时机
    不要在onCreate中直接调用getCredential,此时Activity尚未完全初始化完成。建议将调用逻辑移至用户交互触发(比如按钮点击),或者延后到onStart生命周期方法中,确保Activity处于活跃状态。

  2. 添加异常捕获
    当前代码未处理异常,需要用try-catch包裹getCredential调用,既能避免崩溃,也能获取更详细的异常堆栈信息,辅助定位问题。

  3. 验证Server Client ID
    确认setServerClientId传入的ID是在Google Cloud Console中正确配置的,且与应用的包名、签名指纹完全匹配。

  4. 升级依赖版本
    beta版本可能存在已知bug,尝试升级到最新稳定版或更高版本的依赖库,比如credentials的正式版、play-services-auth的最新版本。

  5. 检查Manifest配置
    确保Manifest中添加了INTERNET权限,以及Google登录相关的必要配置(如对应的meta-data标签)。

修改后的示例代码

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        WindowCompat.setDecorFitsSystemWindows(window, false)
        super.onCreate(savedInstanceState)

        setContent {
            Column(
                modifier = Modifier.fillMaxSize().padding(16.dp),
                verticalArrangement = Arrangement.Center,
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Button(onClick = {
                    lifecycleScope.launch {
                        try {
                            val credentialManager = CredentialManager.create(applicationContext)
                            val result = credentialManager.getCredential(
                                context = this@MainActivity,
                                request = GetCredentialRequest(
                                    listOf(
                                        GetGoogleIdOption.Builder()
                                            .setFilterByAuthorizedAccounts(false)
                                            .setAutoSelectEnabled(false)
                                            .setServerClientId("你的Server Client ID")
                                            .build()
                                    )
                                )
                            )
                            // 处理获取到的凭证
                            Log.d("CredentialSuccess", "获取凭证成功: ${result.credential}")
                        } catch (e: GetCredentialCancellationException) {
                            Log.e("CredentialError", "用户取消操作", e)
                        } catch (e: Exception) {
                            Log.e("CredentialError", "获取凭证失败", e)
                        }
                    }
                }) {
                    Text("获取Google凭证")
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:03:20