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

Credential Manager切换谷歌账号登录时出现ProtoDataStoreConfig匹配错误

Credential Manager多账号登录切换异常问题

Credential Manager是一款Jetpack API,在单一API中支持多种登录方式,如用户名密码、通行密钥和联合登录方案(如谷歌登录),从而简化开发者的集成工作。

此外,对于用户而言,Credential Manager统一了不同认证方式的登录界面,让用户无论选择哪种方式,都能更清晰、更轻松地登录应用。

已添加的依赖配置

libs.versions.toml中的配置:

#noinspection CredentialDependency
androidx-credentials = { module = "androidx.credentials:credentials", version.ref = "credentials" }
androidx-credentials-play-services-auth = { module = "androidx.credentials:credentials-play-services-auth", version.ref = "credentials" }
googleid = { module = "com.google.android.libraries.identity.googleid:googleid", version.ref = "googleid" }

Gradle构建文件中的依赖声明:

// Added dependencies
// Credential Manager
implementation(libs.androidx.credentials)
implementation(libs.androidx.credentials.play.services.auth)
implementation(libs.googleid)

Google登录按钮Composable代码

@Composable
fun GoogleSignInButton() {

    val context = LocalContext.current
    val scope = rememberCoroutineScope()

    val onClick = {
        val rawNonce = UUID.randomUUID().toString()
        val md = MessageDigest.getInstance("SHA-256")

        val digest = md.digest(rawNonce.toByteArray())
        val hashedNonce = digest.fold("") { str, it -> str + "%02x".format(it) }

        val credentialManager = CredentialManager.create(context)
        val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
            .setFilterByAuthorizedAccounts(false)
            .setServerClientId("xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com")
            .setNonce(hashedNonce)
            .setAutoSelectEnabled(false)
            .build()

        val request: GetCredentialRequest = GetCredentialRequest.Builder()
            .addCredentialOption(googleIdOption)
            .build()

        scope.launch {
            try {
                val credentialResponse = credentialManager.getCredential(
                    request = request,
                    context = context
                )

                val credential = credentialResponse.credential
                val googleIdTokenCredential = GoogleIdTokenCredential
                    .createFrom(credential.data)

                val googleIdToken = googleIdTokenCredential.idToken

                Log.d("GoogleSignInButton", "Google ID Token: $googleIdToken")
                // Proceed with using the Google ID token for authentication.
                Toast.makeText(context, "Signed In!", Toast.LENGTH_SHORT).show()
            } catch (e: GetCredentialCancellationException){
                e.printStackTrace()
            } catch (e: GetCredentialException){
                e.printStackTrace()
            } catch (e: GoogleIdTokenParsingException){
                e.printStackTrace()
            }
        }

    }

    Button(onClick = {
        onClick()
    }) {
        Text(text = "SignIn with Google")
    }
}

MainActivity代码

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            CredentialsTheme {
                Column(
                    modifier = Modifier.fillMaxSize(),
                    horizontalAlignment = Alignment.CenterHorizontally,
                    verticalArrangement = Arrangement.Center,
                ) {
                    GoogleSignInButton()
                }
            }
        }
    }
}

问题现象

设备上存在多个谷歌账号,使用上述代码时,部分账号登录正常,但切换其他账号重新登录时会抛出以下错误:

2024-08-12 14:40:57.419  3829-3829  System.err              com.being.coder.app.credentials      W  androidx.credentials.exceptions.NoCredentialException: During begin sign in, failure response from one tap: 8: [8] UNKNOWN EXCEPTION - java.lang.IllegalArgumentException: ProtoDataStoreConfig<xgc> doesn't match previous call [uri=android://com.google.android.gms/files/auth_api_credentials/com.google%3Amyemailaddress%40gmail.com/gislamssettings.pb] [variantConfig]
2024-08-12 14:40:57.427  3829-3829  System.err              com.being.coder.app.credentials      W      at androidx.credentials.playservices.controllers.CredentialProviderBaseController$Companion.getCredentialExceptionTypeToException$credentials_play_services_auth_release(CredentialProviderBaseController.kt:110)
2024-08-12 14:40:57.427  3829-3829  System.err              com.being.coder.app.credentials      W      at androidx.credentials.playservices.controllers.BeginSignIn.CredentialProviderBeginSignInController$resultReceiver$1$onReceiveResult$1.invoke(CredentialProviderBeginSignInController.kt:93)
2024-08-12 14:40:57.427  3829-3829  System.err              com.being.coder.app.credentials      W      at androidx.credentials.playservices.controllers.BeginSignIn.CredentialProviderBeginSignInController$resultReceiver$1$onReceiveResult$1.invoke(CredentialProviderBeginSignInController.kt:93)
2024-08-12 14:40:57.427  3829-3829  System.err              com.being.coder.app.credentials      W      at androidx.credentials.playservices.controllers.CredentialProviderController.maybeReportErrorFromResultReceiver(CredentialProviderController.kt:159)
2024-08-12 14:40:57.427  3829-3829  System.err              com.being.coder.app.credentials      W      at androidx.credentials.playservices.controllers.BeginSignIn.CredentialProviderBeginSignInController.access$maybeReportErrorFromResultReceiver(CredentialProviderBeginSignInController.kt:56)
2024-08-12 14:40:57.427  3829-3829  System.err              com.being.coder.app.credentials      W      at androidx.credentials.playservices.controllers.BeginSignIn.CredentialProviderBeginSignInController$resultReceiver$1.onReceiveResult(CredentialProviderBeginSignInController.kt:91)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:50)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at android.os.Handler.handleCallback(Handler.java:751)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at android.os.Handler.dispatchMessage(Handler.java:95)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at android.os.Looper.loop(Looper.java:186)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at android.app.ActivityThread.main(ActivityThread.java:6513)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at java.lang.reflect.Method.invoke(Native Method)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
2024-08-12 14:40:57.428  3829-3829  System.err              com.being.coder.app.credentials      W      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:804)

测试覆盖Android 7.1、Android 11和Android 12设备,均出现相同错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:24:51