我有一个DispatchActivity作为我的Launcher Activity,用于检查当前是否有用户登录。如果用户已登录,我将它们发送到他们的ProfileActivity。否则,我将它们发送到LogInActivity。这是我在DispatchActivity中的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dispatch);
//.....................
auth = FirebaseAuth.getInstance();
authListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
launchProfileActivity();
} else {
// User is signed out
launchLoginActivity();
}
}
};
}
@Override
public void onStart() {
super.onStart();
auth.addAuthStateListener(authListener);
}
@Override
public void onStop() {
super.onStop();
if (authListener != null) {
auth.removeAuthStateListener(authListener);
}
}
无论我做什么,firebaseAuth.getCurrentUser(),都不会在我的主要测试设备上返回null。根据文档,getCurrentUser()将为null,除非有一个用户当前登录。当我记录这个用户的一些细节时,它们与我之前创建的“测试”用户一致,(即调用user.getEmail()返回“email@example.com”。
这是有问题的,因为我肯定在我的控制台的用户数据库(在身份验证/用户中)中没有任何用户。我不久前从数据库中删除了这个测试用户,数据库为空。
我尝试在另一台设备上运行该应用程序,并且它已正确执行。但是,在我的主要测试设备上执行全新安装不会解决问题。
问题: 据我所知,问题与我的设备的某种持久用户状态有关;因为运行不同的设备工作正常。由于我没有故意将此配置发生,我想知道是什么导致我的Auth用户数据库和设备之间的这种不一致。
如果数据库为空,auth.getCurrentUser()从哪里获取此先前删除的用户对象?
谢谢。
答案 0 :(得分:3)
Firebase身份验证将在用户登录时缓存用户身份验证令牌。这可以防止必须对用户与Firebase提供的其他服务进行的每次小互动进行身份验证。此令牌会定期自动刷新,但在此之前,SDK会假定令牌代表用户。您会发现令牌将在一段时间后过期,或者您可以通过卸载并重新安装应用程序或清除其数据来强制解决问题。
无论实时数据库的内容如何,身份验证都有效。它们彼此独立,除非安全规则限制对当前经过身份验证的用户的访问。
答案 1 :(得分:0)
我有同样的问题,无法在任何地方找到这个问题的答案。我尝试了一切。我不知道为什么会这样,但我重新启动手机,它碰巧修复了一切。超级晚了,但希望它能帮助其他任何有同样问题的人。
答案 2 :(得分:0)
在清单文件中添加以下内容
在<manifest>
标签中(末尾)
xmlns:tools="http://schemas.android.com/tools"
然后在<application>
标记中(开头)
tools:replace="android:allowBackup"
android:allowBackup="false"
android:fullBackupContent="false"
就像上面提到的@Doug Stevenson firebase在电话上保存一些数据一样,添加这些标签将确保不会发生...因此,当您卸载应用程序并再次安装时,它将清除与该应用程序关联的所有数据