Когда я пытаюсь петь пользователя с Google, я запускаю 2 потока, один, если у пользователя уже есть учетная запись в моем приложении, а второй, если они этого не делают. Проблема в том, что при первой загрузке приложения из Play Store они пытаются войти в Google, оно не работает как для войти, так и для регистрации потоков - выброшен NocredentialSexception. Он работает только после того, как пользователь перезапускает приложение (процесс убийства + запускается снова, но не всегда) или изменяет ориентацию на устройство. < /P>
Ниже моя текущая реализация. Еще не пробовал его по производству, но ранее у меня была версия, когда менеджер был создан с использованием контекста деятельности, теперь его контекст приложения, вводимый через Койн, так как я думал, что это может помочь, если у CredentialManager есть контекст приложения вместо пользовательского интерфейса. Вот аналогичная проблема, но, очевидно, это не фиксированное https://issuetracker.google.com/issues/4173397944
actual class GoogleAuthClient(
private val activityProvider: ActivityProvider,
private val manager: CredentialManager
) {
actual suspend fun getIdToken(clientId: String): String? {
val activity = activityProvider.currentActivity() ?: return null
val signIn = GetGoogleIdOption.Builder()
.setServerClientId(clientId)
.setFilterByAuthorizedAccounts(true)
.setAutoSelectEnabled(true)
.build()
val signUp = GetGoogleIdOption.Builder()
.setServerClientId(clientId)
.setFilterByAuthorizedAccounts(false)
.setAutoSelectEnabled(false)
.build()
val trySignIn = GetCredentialRequest.Builder().addCredentialOption(signIn).build()
val trySignUp = GetCredentialRequest.Builder().addCredentialOption(signUp).build()
val response = try {
manager.getCredential(activity, trySignIn)
} catch (e: NoCredentialException) {
CrashReporter.recordException(e)
try {
manager.getCredential(activity, trySignUp)
} catch (e: NoCredentialException) {
CrashReporter.log("No credentials found for the second time")
CrashReporter.recordException(e)
return null
}
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
CrashReporter.recordException(e)
return null
}
return handleSignIn(response.credential)
}
private fun handleSignIn(credential: Credential): String? {
if (credential is CustomCredential &&
credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
) {
return try {
GoogleIdTokenCredential.createFrom(credential.data).idToken
} catch (e: GoogleIdTokenParsingException) {
CrashReporter.recordException(e); null
}
}
return null
}
actual suspend fun signOut() {
try {
manager.clearCredentialState(ClearCredentialStateRequest())
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
CrashReporter.recordException(e)
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-app-for