Я использую Сервисы Google Play для моей игры libgdx. Я создал несколько фиктивных достижений для тестирования и позже хотел их удалить. На моем телефоне я зашел в Google Play Игры -> Настройки -> Удалить данные Play Игры -> Удаленные данные из моей игры.
Вернувшись в свою игру, я заметил, что игра думала, что я все еще вошел в систему. Я использую следующий код, чтобы проверить, вошел ли пользователь в систему:
@Override
public boolean isSignedIn(){
return GoogleSignIn.getLastSignedInAccount(androidLauncher) != null;
}
Если пользователь не вошел в систему, я пытаюсь войти в него без уведомления
private void signInSilently() {
signedInClient.silentSignIn().addOnCompleteListener(androidLauncher,
new OnCompleteListener<GoogleSignInAccount>() {
@Override
public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
if (task.isSuccessful()) {
signedInAccount = task.getResult();
}
}
});
}
Если я не могу подписать их молча. Я создаю новое намерение, чтобы они вручную вошли в систему и дали доступ к приложению:
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
signedInAccount = result.getSignInAccount();
showSignedInDialog();
}
Проблема в том, что после удаления данных Play Games мой метод isSignedIn
всегда возвращает значение true. Однако, когда я пытаюсь сделать что-то вроде отображения достижений, я получаю следующую ошибку:
com.google.android.gms.common.api.ApiException: 4: The user must be signed in to make this API call.
Код для отображения достижений:
@Override
public void showAchievements(){
androidLauncher.runOnUiThread(new Runnable() {
@Override
public void run() {
if (isSignedIn()) {
loadingView.showLoadingView();
Games.getAchievementsClient(androidLauncher, signedInAccount)
.getAchievementsIntent()
.addOnSuccessListener(new OnSuccessListener<Intent>() {
@Override
public void onSuccess(Intent intent) {
androidLauncher
.startActivityForResult(intent, RC_ACHIEVEMENT_UI);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Logger.error(e);
}
})
}
}
});
}
Мне любопытно, почему это происходит. Согласно документации , мой метод isSignedIn
должен работать правильно. Однако, поскольку я получаю ошибку, которую я получаю, когда я на самом деле пытаюсь сделать вызов API, кажется, что метод не работает. Я могу только предположить, что все это происходит от того, что я удалил свои данные игр, так как до этого момента все работало нормально.
Что-то еще, что я хочу отметить - Я попытался, чтобы мой метод isSignedIn
возвратил false для принудительного входа в систему без вывода сообщений. Мой вход в систему без вывода сообщений возвратил следующую ошибку:
com.google.android.gms.common.api.ApiException: 8: 8:
Я провел небольшое исследование и нашел сообщение об ошибке . Похоже, код состояния 8 Внутренняя ошибка . Google, по крайней мере, знает о проблеме .
Обновление : после того, как мой метод isSignedIn
вернул false, и после отключения моего тихого входа я принудительно выполнил вход в систему. После принудительного входа и входа в систему он теперь работает , Однако я не смогу сделать это для пользователей, если они столкнутся с той же проблемой. Они застрянут, так как метод isSignedIn
, кажется, всегда возвращает true после удаления данных Play Games.