- Сервисы Google Play Версия 11.6.2
- Целевой Android SDK 27
Я реализовал предложенный новый поток GoogleSignIn, ссылаясь на проект TypeANumber, предоставленный Google в репозитории.ниже:
https://github.com/playgameservices/android-basic-samples/blob/master/TypeANumber/src/main/java/com/google/example/games/tanc/MainActivity.java
Сценарий сбоя:
- Пользователь прошел проверку подлинности и успешно вошел в систему.
- Приложение приостанавливается и возобновляется.
- Пользователь пытается выйти из Google, вызвав указанный ниже метод выхода.
Это мой код инициализации:
public void initialize(Activity activity, View viewForGamePopups) {
this.activity = activity;
this.viewForGamePopups = viewForGamePopups;
GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).
requestServerAuthCode(backendClientId).
requestProfile().
build();
googleSignInClient = GoogleSignIn.getClient(activity, googleSignInOptions);
}
Для входа в систему:
public void signIn() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if(isSignedIn()) {
silentSignIn();
} else {
activity.startActivityForResult(googleSignInClient.getSignInIntent(), RC_SIGN_IN);
}
}
});
}
public boolean isSignedIn() {
return GoogleSignIn.getLastSignedInAccount(activity) != null;
}
public void onActivityResult(int requestCode, int responseCode, Intent intent) {
if (requestCode == RC_SIGN_IN) {
try {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(intent);
GoogleSignInAccount account = task.getResult(ApiException.class);
setViewForGamePopups(account);
onConnected(account);
} catch (ApiException apiException) {
String message = apiException.getMessage();
if (message == null || message.isEmpty()) {
message = "Unexpected error!";
}
onDisconnected();
}
}
}
private void silentSignIn() {
googleSignInClient.silentSignIn().addOnCompleteListener(activity,
new OnCompleteListener<GoogleSignInAccount>() {
@Override
public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
if (task.isSuccessful()) {
GoogleSignInAccount googleSignInAccount = task.getResult();
setViewForGamePopups(googleSignInAccount);
} else {
signOut();
}
}
}
);
}
Для выделения:
public void signOut() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (!isSignedIn()) {
return;
}
googleSignInClient.signOut().addOnCompleteListener(activity,
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
...
}
}
);
}
});
}
Произошел сбой при следующей трассировке стека:
Неустранимое исключение: java.lang.IllegalStateException: не подключено.Вызовите connect () и дождитесь вызова onConnected ().на com.google.android.gms.common.internal.zzd.zzaka (неизвестный источник: 10) на com.google.android.gms.common.internal.zzd.zzakb (неизвестный источник: 17) на com.google.android.gms.games.internal.GamesClientImpl.zzg (неизвестный источник: 5) на com.google.android.gms.games.internal.GamesClientImpl.zza (неизвестный источник: 5) на com.google.android.gms.common.api.internal.zzbr.signOut (неизвестный источник: 77) на com.google.android.gms.common.api.internal.zzbp.zzaih (неизвестный источник: 26) на com.google.android.gms.common.api.internal.zzbp..java: 65)
Я добавил тихий вход для случая onResume, как это предлагается в примере TypeANumber.
public void onResume() {
logD("Silent sign in onResume called!");
googleSignInClient.silentSignIn().addOnCompleteListener(new OnCompleteListener<GoogleSignInAccount>() {
@Override
public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
if(task.isComplete()) {
logD("Google Connection completed!");
}
if(task.isSuccessful()) {
logD("Google Connection success!");
} else {
logD("Google Connection failed!");
}
}
});
logD("Silent sign in onResume ended!");
}
Даже если я нажимаю кнопку выхода после тихого входабыло завершено (onResume), я все еще получаю этот сбой.
Есть ли обходной путь для этой проблемы?