我收到了一个崩溃说,这是因为调用getCurrentUser()
引起的。以下是Crashlytics崩溃日志的相关部分:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.c.f com.google.android.gms.common.api.e.b(com.google.android.gms.common.api.internal.aj)' on a null object reference
at com.google.android.gms.internal.zzdvv.zzb(Unknown Source)
at com.google.android.gms.internal.zzdwc.zza(Unknown Source)
at com.google.firebase.auth.FirebaseAuth.getCurrentUser(Unknown Source)
at com.google.firebase.auth.FirebaseAuth.getCurrentUser(Unknown Source)
at <my.app.package>.<class1>.isUserNull(Unknown Source)
at <my.app.package>.<class2>.requestUserLogin(Unknown Source)
我正在为我的应用程序使用MVP架构,并在辅助类中调用相应的Firebase函数。结构/流程如下所示:
Activity > Presenter > Interactor > Helper
一旦活动开始,它就会初始化presenter,它会初始化交互器,初始化帮助程序类。帮助程序类如下所示:
public class Helper{
private FirebaseAuth mAuth;
public Helper(@NonNull Listener){
mAuth = FirebaseAuth.getInstance();
}
public boolean isUserNull(){
return mAuth.getCurrentUser() == null;
}
}
正如帮助程序类中所见,FirebaseAuth已正确初始化,因此调用getCurrentUser()
应该是安全的。
getCurrentUser()
会返回FirebaseUser
或null,因此我认为在这种情况下,让用户当前登录与否并不重要。
我们已经在我们的结束时进行了测试,之前从未体验过这一点,这就是为什么这非常令人困惑。到目前为止,在众多用户中添加了它,这是它发生的唯一实例。
之前有没有人经历过类似的事情,或者有什么想法可以引起它?
我正在考虑将功能更改为直接获取FirebaseAuth实例,如下所示:
public boolean isCurrenUserNull(){
return FirebaseAuth.getInstance().getCurrentUser() == null;
}
但我不确定这是否会改变任何事情。
更新:回应Bob Snyder的回答/评论
该应用目前以初始活动开始,该活动会检查应用的必要要求,例如Google Play服务要求。如果失败,则关闭,如果它没有,则通过getCurrentUser()
功能检查是否存在已存在的用户。这可能是出于某种原因发生错误的地方。
关于&#34; 消息接收,通知意图...... &#34; - FCM目前已实施,可以接收通知,点击时,用户将被定向到相应的活动。
然而,要使其工作,用户应该能够至少经过一次初始签名,并且应该保持登录状态。否则,他们将不再收到通知(我将处理注销作为我发布了here)。
考虑到这一点,如果FCM立即起作用,那么确保Google Play服务已经是最新的吗?
非常感谢您的想法和建议!
答案 0 :(得分:0)
已报告其他与Auth相关的NullPointerExceptions的堆栈跟踪,例如this one和this one。
原因通常是设备没有安装兼容版本的Google Play服务。由于大多数Firebase SDK都需要兼容版本的Google Play服务,因此您的应用初始化应使用GoogleApiAvailabilty来检查它是否已安装,如果没有,则采取适当的措施。这在Guide for FCM中进行了讨论。
在您对此答案的评论中,您解释说您正在检查Google Play服务的可用性,并且如果需要更新并且未成功完成或被用户拒绝,则会阻止该应用运行。如果您对处理所有这些情况有任何疑问,可以在抛出NPE的语句之前立即添加此代码:
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) != ConnectionResult.SUCCESS) {
throw new IllegalStateException("Play Services not available"));
// or
Crashlytics.logException(new IllegalStateException("Play Services not available"));
}