使用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-beta03androidx.credentials.credentials:credentials-play-services-auth:1.2.0-beta03com.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") } } }
排查与解决建议
调整调用时机
不要在onCreate中直接调用getCredential,此时Activity尚未完全初始化完成。建议将调用逻辑移至用户交互触发(比如按钮点击),或者延后到onStart生命周期方法中,确保Activity处于活跃状态。添加异常捕获
当前代码未处理异常,需要用try-catch包裹getCredential调用,既能避免崩溃,也能获取更详细的异常堆栈信息,辅助定位问题。验证Server Client ID
确认setServerClientId传入的ID是在Google Cloud Console中正确配置的,且与应用的包名、签名指纹完全匹配。升级依赖版本
beta版本可能存在已知bug,尝试升级到最新稳定版或更高版本的依赖库,比如credentials的正式版、play-services-auth的最新版本。检查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
相关产品推荐
相关产品推荐

