GoogleSignInClient.signOut崩溃并显示以下错误:“调用connect()并等待调用onConnected()”

时间:2019-02-13 08:12:46

标签: android google-play-services google-signin google-play-games

  • Google Play服务版本11.6.2
  • 目标Android SDK 27

我通过参考以下存储库中Google提供的TypeANumber项目来实现建议的新GoogleSignIn流程:

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)

我已经按照TypeANumber示例中的建议为onResume案例添加了静默登录。

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)之后按退出按钮,我仍然会遇到此崩溃。

有没有解决此问题的方法?

1 个答案:

答案 0 :(得分:0)

正如我在帖子中所说,在活动的“ onResume”回调中调用silentSignIn并不能解决Google Play服务版本11.6.2的崩溃问题。将Google Play服务版本升级到12.0.1后,我无法再次重现崩溃。即使在删除“ onResume”方法中的silentSignIn调用之后,该应用也不再崩溃。