android - 如何在一个 Activity 中登录和退出 Google
问题描述
我是 Java 和 Android 编程的初学者。我正在尝试在我的应用上使用 Google 创建登录系统。我想要做的是在活动中切换登录和退出按钮。但是,一旦我成功登录,我就永远无法退出 Google。即使我卸载了该应用程序,我也无法退出。
这是我的代码。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
mSignInButton = findViewById(R.id.sign_in_button);
mSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
signIn();
}
});
mSignOutButton = findViewById(R.id.sign_out_button);
mSignOutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
signOut();
}
});
@Override
protected void onStart() {
// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);
super.onStart();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
private void signIn() {
Intent intent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(intent, RC_SIGN_IN);
}
private void signOut() {
mGoogleSignInClient.signOut();
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
String idToken = account.getIdToken();
// Send the token to the API endpoint and validate
// Signed in successfully, show authenticated UI.
updateUI(account);
} catch (ApiException e) {
// The ApiException status code indicates the detailed failure reason.
// Please refer to the GoogleSignInStatusCodes class reference for more information.
updateUI(null);
}
}
private void updateUI(GoogleSignInAccount signInAccount) {
if (signInAccount != null) {
mSignInButton.setVisibility(View.GONE);
mSignOutButton.setVisibility(View.VISIBLE);
} else {
mSignInButton.setVisibility(View.VISIBLE);
mSignOutButton.setVisibility(View.GONE);
}
}
如何正确退出并在一项活动中更新 UI?
解决方案
尝试根据有关如何注销和断开连接的文档更新您的代码。这将等到用户从服务器注销并更新应用程序 UI。
private void signOut() {
mGoogleSignInClient.signOut()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
updateUI(null);
}
});
}
推荐阅读
- python - Keras 中预测数据的反比例
- php - str_replace 方法在 php 中不起作用
- eclipse - 如何使用scala制作一个简单的界面
- javascript - 在循环中删除多个 JSON 对象
- python - 我可以使用 GitPython 将 bitbucket 存储库导入到 gitlab 吗?
- python - 如何修复弹性搜索中的“KeyError:'*'”
- c# - 关于在我的设计中是否有继承的困惑
- java - 读取 Java/Spring 中的属性值
- java - Bean 名称“bookDto”的 BindingResult 和普通目标对象都不能用作请求属性
- reactjs - 如何在 redux observable 史诗中为 ajax 响应发出两个动作