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

