GoogleSignInClient.signOut вылетает с: «Вызовите connect () и дождитесь вызова onConnected ()»

1
  • Сервисы 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.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), я все равно получаю этот сбой.

Есть ли решение этой проблемы?

Теги:
google-play-services
google-play-games
google-signin

1 ответ

0

Как я сказал в посте, вызову silentSignIn в обратном вызове "onResume" действия не помогло исправить ошибку с помощью Google Play Service версии 11.6.2. После обновления версии Сервиса Google Play до 12.0.1 я не смог воспроизвести сбой снова. Даже после удаления вызова silentSignIn в методе "onResume" приложение больше не зависало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню