Reputation: 3274
From the official page of Sign in your user with Credential Manager, it is clearly written there
Credential Manager is a Jetpack API that supports multiple sign-in methods, such as username and password, passkeys, and federated sign-in solutions (such as Sign-in with Google) in a single API, thus simplifying the integration for developers.
Furthermore, for users, Credential Manager unifies the sign-in interface across authentication methods, making it clearer and easier for users to sign into apps, regardless of the method they choose.
I have added required dependencies:
#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 build file is:
// Added dependencies
// Credential Manager
implementation(libs.androidx.credentials)
implementation(libs.androidx.credentials.play.services.auth)
implementation(libs.googleid)
I have a composable function
@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 is
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()
}
}
}
}
}
There are many (more than one) google accounts on a device, with the above code, when I sign in with some account it works, but when I re-sign in using different account, it gives me error:
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)
My Device uses Android 7.1
, I have tested this conde on Android 11
and Android 12
, but same error, Kindly help me in this case
Project is available here Credentials
Upvotes: 0
Views: 190
Reputation: 1
hmm, I have the same problem with android 6.01 en 7. But in android 14 the problem is solved.
Upvotes: 0