Когда я пытаюсь петь пользователя с Google, я запускаю 2 потока, один, если у пользователя уже есть учетная запись в моем приложении, а второй, если они этого не делают. Проблема в том, что при первой загрузке приложения из Play Store они пытаются войти в Google, оно не работает как для войти, так и для регистрации потоков - выброшен NocredentialSexception. Он работает только после того, как пользователь перезапускает приложение (процесс убийства + запускается снова, но не всегда) или изменяет ориентацию на устройство. < /P>
Ниже моя текущая реализация. Еще не пробовал его по производству, но ранее у меня была версия, когда менеджер был создан с использованием контекста деятельности, теперь его контекст приложения, вводимый через Койн, так как я думал, что это может помочь, если у CredentialManager есть контекст приложения вместо пользовательского интерфейса. Вот аналогичная проблема, но, очевидно, это не фиксированное https://issuetracker.google.com/issues/4173397944
@edit 12.08.2025
Calling с контекстом приложения не сработала. Переключение от getgoogleidoption на GetsigninWithgoogleoption также не сработала. Это странно, так как иногда его даже достаточно, если я нажимаю на что-то на экране адаптации, и он начинает работать (или, как упоминалось ранее, rorte device, перейти на главный экран и обратно в приложение-но не всегда) < /p>
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
Диспетчер учетных данных не может подписать пользователя с Google 2 раза при запуска приложений в первый раз ⇐ Android
Форум для тех, кто программирует под Android
1755244058
Anonymous
Когда я пытаюсь петь пользователя с Google, я запускаю 2 потока, один, если у пользователя уже есть учетная запись в моем приложении, а второй, если они этого не делают. Проблема в том, что при первой загрузке приложения из Play Store они пытаются войти в Google, оно не работает как для войти, так и для регистрации потоков - выброшен NocredentialSexception. Он работает только после того, как пользователь перезапускает приложение (процесс убийства + запускается снова, но не всегда) или изменяет ориентацию на устройство. < /P>
Ниже моя текущая реализация. Еще не пробовал его по производству, но ранее у меня была версия, когда менеджер был создан с использованием контекста деятельности, теперь его контекст приложения, вводимый через Койн, так как я думал, что это может помочь, если у CredentialManager есть контекст приложения вместо пользовательского интерфейса. Вот аналогичная проблема, но, очевидно, это не фиксированное https://issuetracker.google.com/issues/4173397944
@edit 12.08.2025
Calling с контекстом приложения не сработала. Переключение от getgoogleidoption на GetsigninWithgoogleoption также не сработала. Это странно, так как иногда его даже достаточно, если я нажимаю на что-то на экране адаптации, и он начинает работать (или, как упоминалось ранее, rorte device, перейти на главный экран и обратно в приложение-но не всегда) < /p>
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)
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79732238/credential-manager-fails-to-sign-user-with-google-2-times-when-launching-app-for[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия