我有一个包含3项活动的应用程序:登录活动,主要活动和详细活动。
登录活动使用Google登录来获取用户的帐户(令牌ID和电子邮件)。
Main活动和Detail活动都需要GoogleSignInAccount
。
我不希望应用程序始终启动登录活动,并在用户启动应用程序时透明地重新登录。
我不想将令牌ID和用户电子邮件存储在共享偏好设置上,我更倾向于在我的应用中直接操作GoogleSignInAccount
。
处理此登录方案的正确流程是什么?我应该尝试在每个屏幕中执行silentSignIn
,还是有更好的方法来存储和检索GoogleSignInAccount
?
答案 0 :(得分:2)
是的,您可以将silentSignIn
用于此目的。
如果您正在寻找UI线程上的GoogleSignInAccount
,则以下是异步版本:
Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient).setResultCallback(
new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(@NonNull GoogleSignInResult result) {
if (googleSignInResult.isSuccess() {
GoogleSignInAccount gsa = googleSignInResult.getSignInAccount();
}
}
});
注意:如果您的mGoogleApiClient未使用enableAutoManage构建,则必须手动调用mGoogleApiClient.connect()和mGoogleApiClient.disconnect()才能使上述代码示例正常工作。有关详细信息,请参阅有关managing the GoogleApiClient connection lifecycle的更多信息。
或者在非UI线程上,您可以使用以下示例代码:
try {
ConnectionResult result = mGoogleApiClient.blockingConnect();
if (result.isSuccess()) {
GoogleSignInResult googleSignInResult =
Auth.GoogleSignInApi.silentSignIn(googleApiClient).await();
if (googleSignInResult.isSuccess() {
GoogleSignInAccount gsa = googleSignInResult.getSignInAccount();
}
}
} finally {
mGoogleApiClient.disconnect();
}
查看documentation了解更多详情,包括使用Google帐户ID令牌进行后端身份验证或API调用。
答案 1 :(得分:1)
您还可以将 GoogleSignInAccount 作为额外的意图输入传递:
GoogleSignInAccount acct = result.getSignInAccount();
Intent intent = new Intent(this, AnotherActivity.class);
intent.putExtra("singedInAccount", acct);
startActivity(intent);
并在 onCreate()中接收另一个的活动方法:
getIntent().getParcelableExtra("singedInAccount");
请注意,必须使用 getParcelableExtra()而不是 getSerializableExtra(),只要GoogleSignInAccount实现Parcelable而不是Serializable接口。