Но есть один случай, когда я удаляю игру и удаляю игровые данные из приложения Play Games (Настройки > Удалить Play Игровая учетная запись и данные > Удалить мои игровые данные). После переустановки я получаю код ошибки 4: SIGN_IN_REQUIRED, и если я закрываю игру и открываю ее снова, она работает нормально.

Почему такое странное поведение при реализации, в первый раз не работает, но при втором запуске начинает работать.
вот мой код:
Код: Выделить всё
class FirebasePlayGamesAuth {
private var auth: FirebaseAuth = FirebaseAuth.getInstance()
private lateinit var gamesSignInClient: GamesSignInClient
private lateinit var webClientId: String
private var nativeAuthComplete = CompletableFuture()
//1
fun triggerLogin(activity: Activity): CompletableFuture {
webClientId = activity.resources.getString(R.string.default_web_client_id)
gamesSignInClient = PlayGames.getGamesSignInClient(activity)
val currentUser = auth.currentUser
if (currentUser == null) {
checkPlayGamesAuthStatus()
} else {
nativeAuthComplete.complete(currentUser)
}
return nativeAuthComplete
}
//2
private fun checkPlayGamesAuthStatus() {
gamesSignInClient.isAuthenticated.addOnCompleteListener { isAuthenticatedTask: Task ->
val isAuthenticated =
isAuthenticatedTask.isSuccessful && isAuthenticatedTask.result.isAuthenticated
if (isAuthenticated) {
requestFirebaseCredentials()
} else {
nativeAuthComplete.completeExceptionally(FirebasePlayGameAutoLoginFailed())
}
}
}
//3
private fun requestFirebaseCredentials() {
gamesSignInClient.requestServerSideAccess(webClientId, false)
.addOnCompleteListener { task: Task ->
if (task.isSuccessful) {
task.result?.let { serverAuthToken ->
authenticateWithFirebaseCredential(serverAuthToken)
} ?: run {
nativeAuthComplete.completeExceptionally(FirebaseServerSideAccessFailed())
}
} else {
task.exception?.let { exception ->
println("credential error: ${exception.message}")
if (exception is ResolvableApiException) {
println("auth resolution statred")
exception.startResolutionForResult(myActivity, 1101)
} else {
nativeAuthComplete.completeExceptionally(exception)
}
} ?: run {
nativeAuthComplete.completeExceptionally(FirebaseServerSideAccessFailed())
}
}
}
}
//4
private fun authenticateWithFirebaseCredential(idToken: String) {
val credential = PlayGamesAuthProvider.getCredential(idToken)
auth.signInWithCredential(credential).addOnCompleteListener { task ->
if (task.isSuccessful) {
nativeAuthComplete.complete(auth.currentUser)
} else {
task.exception?.let { exception ->
nativeAuthComplete.completeExceptionally(exception)
} ?: run {
nativeAuthComplete.completeExceptionally(
FirebaseAuthenticationWithCredentialFailed()
)
}
}
}
}
}
Код: Выделить всё
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
PlayGamesSdk.initialize(this)
firebasePlayGamesAuth.triggerLogin(this)
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... d-when-i-d
Мобильная версия