Я реализовал предложенный новый поток GoogleSignIn, сославшись на проект TypeANumber, предоставленный 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.handleMessage (неизвестный источник: 507) на android.os.Handler.dispatchMessage(Handler.java:101) на android.os.Looper.loop(Looper.java:164) на android.os.HandlerThread.run(HandlerThread.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), я все равно получаю этот сбой.
Есть ли решение этой проблемы?
Как я сказал в посте, вызову silentSignIn в обратном вызове "onResume" действия не помогло исправить ошибку с помощью Google Play Service версии 11.6.2. После обновления версии Сервиса Google Play до 12.0.1 я не смог воспроизвести сбой снова. Даже после удаления вызова silentSignIn в методе "onResume" приложение больше не зависало.