我通过参考以下存储库中Google提供的TypeANumber项目来实现建议的新GoogleSignIn流程:
崩溃情况:
这是我的初始化代码:
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)之后按退出按钮,我仍然会遇到此崩溃。
有没有解决此问题的方法?
答案 0 :(得分:0)
正如我在帖子中所说,在活动的“ onResume”回调中调用silentSignIn并不能解决Google Play服务版本11.6.2的崩溃问题。将Google Play服务版本升级到12.0.1后,我无法再次重现崩溃。即使在删除“ onResume”方法中的silentSignIn调用之后,该应用也不再崩溃。