getCurrentUser()抛出了NullPointerException

时间:2018-04-06 04:57:43

标签: android firebase firebase-authentication

我收到了一个崩溃说,这是因为调用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服务已经是最新的吗?

非常感谢您的想法和建议!

1 个答案:

答案 0 :(得分:0)

已报告其他与Auth相关的NullPointerExceptions的堆栈跟踪,例如this onethis 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"));
}