我需要使用Firebase(Google或Facebook)对用户进行身份验证。然后,我希望用户在NewUserActivity中添加有关他的更多详细信息,然后输入该应用程序的主要核心。为了检查是否是第一次启动,我使用
prefManager.isFirstTimeLaunch
这没问题,但是我有一个错误。如果用户卸载并重新安装该应用程序,则就像正常情况下第一次启动该应用程序一样。所以我需要检查他是否已经有一个帐户。我用
FirebaseUserMetadata metadata = mAuth.getCurrentUser().getMetadata();
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp())
因此,这应该检查用户是否不是新用户(已经有一个帐户)。
我的完整检查代码是:
mAuthListner = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() != null) {
FirebaseUserMetadata metadata = mAuth.getCurrentUser().getMetadata();
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
if (prefManager.isFirstTimeLaunch()) {
startActivity(new Intent(MainActivity.this, NewUserActivity.class));
}
}
else
{
startActivity(new Intent(MainActivity.this, UserProfile.class));
finishAffinity();
}
}
}
};
问题:
该代码在UserProfile Activity中始终有效。因此,即使用户是新用户,也不要转到NewUserActivity添加详细信息,并且由于UserProfile Activity没有所需的详细信息,因此将引发null异常。
据我所知,问题是这段代码
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp())
不起作用。 如果没有此行,则用户卸载并重新安装应用程序后,应用程序可以正常运行。在这种情况下,它就像一个新用户。
通常来说,这是在Firebase中对用户进行身份验证,在活动中首次添加一些详细信息,然后始终在个人资料中的一种非常正常的情况。
我已经很长时间没有问题了。奇怪的行为始于一周前,没有任何实际原因。所以我几乎说服了它的火力场问题。
澄清
不需要logcat,因为null异常必须始终将代码转到UserProfile,因此没有得到所需的详细信息。
答案 0 :(得分:0)
正如我发现的那样,这是一个firebase错误,由于差异(几秒钟或几次),元数据无法正常工作。仍在测试所有情况,但以下代码看起来可以按预期工作,而不必用其他错误代码替换它:
mAuthListner = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() != null) {
FirebaseUserMetadata metadata = mAuth.getCurrentUser().getMetadata();
**if (Math.abs(metadata.getCreationTimestamp() - metadata.getLastSignInTimestamp()) <5000L){**
if (prefManager.isFirstTimeLaunch()) {
startActivity(new Intent(MainActivity.this, NewUserActivity.class));
}
else{
startActivity(new Intent(MainActivity.this, UserProfile.class));
finishAffinity();
}
}
else{
startActivity(new Intent(MainActivity.this, UserProfile.class));
finishAffinity();
}
}
}
};
希望有帮助!