Google Firebase 在 Android 应用中退出并忘记用户
Posted
技术标签:
【中文标题】Google Firebase 在 Android 应用中退出并忘记用户【英文标题】:Google Firebase sign out and forget user in Android app 【发布时间】:2016-12-07 00:33:06 【问题描述】:当我调用mFirebaseAuth.signOut()
或mFirebaseUser.delete()
时,我的FirebaseAuth.AuthStateListener()
工作正常并在onAuthStateChanged
中将null
作为FirebaseUser
实例返回,我刷新UI 并显示“使用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()
之后发生。
【问题讨论】:
代码或者它没有发生。让我们看看你显示弹出窗口的逻辑。 快速猜测:调用signOut()
会为用户签名 Firebase 身份验证。它不会让用户退出底层社交提供商(例如 Facebook、Google)。因此,下次您启动该提供商的登录流程时,您的代码(或您使用的库)将立即获取它。但是,如果您显示minimal code that reproduces the problem,确实会更容易说出发生了什么。
通过将您的代码与Firebase Auth Quickstart project 进行比较,您可能会得到一些线索。当我使用 Google Signin 运行它时,每次都会显示帐户选择器对话框。不知道这是否适用于 Twitter、Facebook 等。
@FrankvanPuffelen 添加了代码
@qbix 谷歌认证
【参考方案1】:
在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);
);
【讨论】:
不,我没有打电话给Auth.GoogleSignInApi.signOut()
。非常感谢,现在可以使用了。
好找到@qbix!我忘记了快速入门代码的那部分。
信用真的归你@FrankvanPuffelen。你之前的评论让我走上了正轨。
我如何获得mGoogleApiClient
? updateUI
是做什么的?我如何使用 Facebook 做到这一点?我在一个单独的班级中注销。谢谢
@AbAppletic:查看答案中链接的快速入门示例代码。【参考方案2】:
另一个选择是使用FirebaseUI 库。它简化了登录和退出操作,因为它会为您完成所有繁重的工作。
Kotlin
AuthUI.getInstance().signOut(this).addOnCompleteListener
// do something here
Java
AuthUI.getInstance()
.signOut(ActivityMainOld.this)
.addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
// do something here
);
希望对你有帮助
【讨论】:
简洁优雅的解决方案 .. 独立,不需要涉及 GoogleApiClient 参考。很好,谢谢! 在使用 Java 8 监听器的项目中使用最新的 Gradle 和 android Studio 更新可以缩短为.addOnCompleteListener(task -> /* do something here */ );
【参考方案3】:
我很困惑,因为所有解决方案都需要引用GoogleSignInClient
,但实际上并不需要您持有对它的引用,您可以简单地创建一个新实例并在其上调用signOut()
.
GoogleSignIn.getClient(
getContext(),
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).build()
).signOut();
【讨论】:
【参考方案4】:对于希望在其他活动中获得此结果(如恢复 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));
这很容易,而且会奏效。干杯!
【讨论】:
【参考方案5】:你也可以这样定义:
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);
);
【讨论】:
【参考方案6】: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();
);
这段代码是为了复制过去而编写的
【讨论】:
【参考方案7】:我做了mGoogleSignInClient.signOut()
这按预期工作。
【讨论】:
【参考方案8】:您可以为 GoogleAuthProvider 设置自定义参数以强制用户通过 google 重新进行身份验证。
var provider = new Firebase.auth.GoogleAuthProvider();
provider.setCustomParameters(
prompt: 'select_account'
);
【讨论】:
【参考方案9】:以上都没有为我解决问题,
接受的答案需要访问登录视图中定义的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
【讨论】:
【参考方案10】:使用相同的 Firebase Auth 和 GoogleSignInClient 实例, 例如,如果我们在 LoginActivity 中声明并实例化一个名为 mAuth 的 Firebase Auth, 那么如果我们在其他activity中声明一个新的mAuth并尝试调用mAuth.login,它就不能正常工作了。 将 Firebase Auth 和 GoogleSignInClient 变量设为公共和静态变量,并在其他活动中使用相同的变量
【讨论】:
以上是关于Google Firebase 在 Android 应用中退出并忘记用户的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio - Firebase 在尝试签署 facebook 或 google 时返回 null
“无法获取提供程序 com.google.firebase.provider.FirebaseInitProvider”错误路径 Android
android google登录后如何初始化firebase?
如果在 Firebase Android 初始注册期间帐户已与 google 关联,则使用 Facebook 登录