当我致电mFirebaseAuth.signOut()
或mFirebaseUser.delete()
我的FirebaseAuth.AuthStateListener()
正常工作并在null
中将FirebaseUser
作为onAuthStateChanged
实例返回时,我刷新了用户界面显示"使用Google登录"按钮。
但是当我想再次登录时,我没有看到与用户的对话(我的设备上有2个用户,附加了图像)。该应用程序仅在首次登录时显示此对话框,之后它使用相同的用户。如果我在设置屏幕上清除应用程序的数据,我将能够再次看到此对话框。
我的问题是如何在每次退出后显示此对话框。
按下登录按钮时运行此代码:
// in onCreate()
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
// in OnClickListener
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, FirebaseActivity.REQUEST_SIGN_IN);
在onActivityResult()
中,我得到GoogleSignInResult
的实例,因此在我致电startActivityForResult()
之后,我需要的一切都会发生。
答案 0 :(得分:36)
在Firebase Auth Quickstart sample code中,Google提供商的退出包含以下步骤。你在退出时打电话给GoogleSignInClient.signOut()
吗?
private void signOut() {
// Firebase sign out
mAuth.signOut();
// Google sign out
mGoogleSignInClient.signOut().addOnCompleteListener(this,
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
updateUI(null);
}
});
}
答案 1 :(得分:8)
另一种选择是使用FirebaseUI库。它简化了登录和退出操作,因为它将为您完成所有繁重的任务。
<强> 科特林 强>
AuthUI.getInstance().signOut(this).addOnCompleteListener {
// do something here
}
<强> 爪哇 强>
AuthUI.getInstance()
.signOut(ActivityMainOld.this)
.addOnCompleteListener(new OnCompleteListener<Void>(){
@Override
public void onComplete(@NonNull Task<Void> task) {
// do something here
}
});
希望这有帮助
答案 2 :(得分:3)
对于其他任何想要此结果的用户(如将Google帐户选项重新用于其他活动)。
public static void signOut() {
// Firebase sign out
mAuth.signOut();
// Google sign out
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
}
在登录页面上添加此内容,在转到下一个活动之前,只需致电SignOut()
。
// everything ok...
signOut();
startActivity(new Intent(SignIn.this,NextOne.class));
然后,在您的其他课程中,您可以致电
FirebaseAuth.getInstance().signOut();
startActivity(new Intent(NextClass.this, SignIn.class));
这很容易,而且会有效。干杯!
答案 3 :(得分:2)
你也可以定义这样的东西:
private void signOut() {
mAuth.signOut();
mGoogleSignInClient.signOut().addOnCompleteListener(this,
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Intent intent = new Intent(YourActivity.this, NextActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
答案 4 :(得分:0)
private void sendToLogin() { //funtion
GoogleSignInClient mGoogleSignInClient ;
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(getBaseContext(), gso);
mGoogleSignInClient.signOut().addOnCompleteListener(/*CURRENT CLASS */.this,
new OnCompleteListener<Void>() { //signout Google
@Override
public void onComplete(@NonNull Task<Void> task) {
FirebaseAuth.getInstance().signOut(); //signout firebase
Intent setupIntent = new Intent(getBaseContext(), /*To ur activity calss*/);
Toast.makeText(getBaseContext(), "Logged Out", Toast.LENGTH_LONG).show(); //if u want to show some text
setupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(setupIntent);
finish();
}
});
}
这段代码是作为副本编写的,只是在代码中读取 COMMENTS 以根据您的需要自定义它,我更喜欢将用户发送到登录
答案 5 :(得分:0)
我做了mGoogleSignInClient.signOut()
这是按预期工作的。
答案 6 :(得分:0)
您可以为GoogleAuthProvider设置自定义参数,以强制用户通过google重新验证。
var provider = new Firebase.auth.GoogleAuthProvider();
provider.setCustomParameters({
prompt: 'select_account'
});
答案 7 :(得分:0)
我很困惑,因为所有解决方案都需要引用GoogleSignInClient
,但是实际上并不需要您保留对它的引用,您只需创建一个新实例并调用{{1 }} 在上面。
signOut()
答案 8 :(得分:0)
以上均未为我解决问题,
接受的答案需要访问登录视图中定义的mGoogleApiClient
(通常在设置视图中为注销按钮)
另一个答案是建议在登录视图中注销(成功登录之后,然后才启动主视图)。这是在解决mGoogleApiClient
的可访问性问题,但是这种方法的问题是,每次用户打开应用程序时,该应用程序都会在登录视图中结束,并且每次登录都不理想。
这就是我最终要做的事情,它是一种全方位修复程序,支持所有第三方注销选项(在我的情况下为Facebook和Google)
logOutButton.setOnSingleClickListener {
FirebaseAuth.getInstance().currentUser?.getIdToken(false)?.addOnSuccessListener {
result ->
when (result.signInProvider){
"facebook.com" -> {
LoginManager.getInstance().logOut()
signOutFromApp()
}
"google.com" -> {
GoogleSignIn.getClient(
this,
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).build()
).signOut()
signOutFromApp()
}
else -> {
signOutFromApp()
}
}
}
}
private fun signOutFromApp() {
FirebaseAuth.getInstance().signOut()
LauncherActivity.start(this) //starts login view
finish() //finish settigs view
}
答案 9 :(得分:0)
使用 Firebase Auth 和 GoogleSignInClient 的相同实例,
例如,如果我们在 LoginActivity 中声明并实例化了一个名为 mAuth 的 Firebase Auth,
那么如果我们在其他activity中声明一个新的mAuth,尝试调用mAuth.login,就无法正常工作。
将 Firebase Auth 和 GoogleSignInClient 变量设为公开和静态,并在其他活动中使用相同的变量