尝试在空对象引用上调用虚拟方法 com.google.firebase.iid.FirebaseInstanceId.getInstanceId()'

Posted

技术标签:

【中文标题】尝试在空对象引用上调用虚拟方法 com.google.firebase.iid.FirebaseInstanceId.getInstanceId()\'【英文标题】:Attempt to invoke virtual method com.google.firebase.iid.FirebaseInstanceId.getInstanceId()' on a null object reference尝试在空对象引用上调用虚拟方法 com.google.firebase.iid.FirebaseInstanceId.getInstanceId()' 【发布时间】:2019-05-10 13:50:50 【问题描述】:

我将使用firebase-messaging 库并尝试在应用启动时使用以下方法获取令牌。

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener() @覆盖 公共无效 onSuccess(InstanceIdResult instanceIdResult) 字符串令牌 = instanceIdResult.getToken(); // 打印令牌 );

应用程序在启动时崩溃

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.firebase.iid.FirebaseInstanceId.getInstanceId()' on a null object reference

AndroidManifest

<service
      android:name=".MyFirebaseMessageService">
      <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
      </intent-filter>
</service>

构建.gradle:

implementation 'com.google.android.gms:play-services-analytics:16.0.5'
implementation 'com.google.firebase:firebase-messaging:17.3.4'

另外,我曾尝试在 SharedPreferences 中缓存令牌,但似乎从未调用过 onNewToken()。

@Override
    public void onNewToken(String token) 
        super.onNewToken(token);
        SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = preference.edit();
        editor.putString("TOKEN",token);
        editor.apply();
    

可能是什么问题?

【问题讨论】:

【参考方案1】:

合并清单中存在问题,合并清单中缺少以下服务。 在AndroidManifest.xml 中添加了相同的内容,它就像一个魅力。

 <service android:name="com.google.firebase.components.ComponentDiscoveryService" >
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.iid.Registrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
 </service>

现在一切正常。

【讨论】:

它对我来说仍然崩溃。有什么建议吗? 对我来说还有什么建议吗? @all 我会告诉你我解决它的方法。我创建了一个示例项目并使用了 firebase-messaging 库并比较了示例项目的合并清单和我的原始项目。您可以执行相同的操作并找出两者都缺少的内容,将缺少的条目添加到您的原始项目中,它应该可以工作。 无法在 onMesssageRecieve 中获取通知我使用上面相同的代码 三天后遇到同样的问题我不知道是什么问题【参考方案2】:

我在将 .aar 清单与主应用程序清单合并时遇到同样的问题,正如 @alphaguy 提到合并清单后缺少组件,并且在添加以下服务后,他提到错误消失了:

<service
        android:name="com.google.firebase.components.ComponentDiscoveryService"
        android:exported="false" >
        <meta-data
            android:name="com.google.firebase.components:com.google.firebase.iid.Registrar"
            android:value="com.google.firebase.components.ComponentRegistrar" />
        <meta-data
            android:name="com.google.firebase.components:com.google.firebase.messaging.FirebaseMessagingRegistrar"
            android:value="com.google.firebase.components.ComponentRegistrar" />
    </service>

但是 firebase Messaging 仍然无法正常工作,因为接收 FirebaseInstanceId 和 FirebaseMessaging 事件并将它们传递给特定于应用程序的 FirebaseInstanceIdService 的 WakefulBroadcastReceiver 也丢失了,此接收器通过清单合并自动添加到您的应用程序的清单文件中,在我们的例子中它丢失了在合并中,所以我们需要手动添加它,如下所示:

<receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
        android:exported="false"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </receiver>

FirbaseInstanceIdReceiver 文档:https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceIdReceiver

注意:您可能需要在您的ApplicationClass 中添加FirebaseApp.initializeApp(this); onCreate

public class MyApplicationClass extends Application 

@Override
public void onCreate() 
    super.onCreate();
    FirebaseApp.initializeApp(this);

【讨论】:

【参考方案3】:

您需要添加以下软件包,

    Xamarin.Firebase.Lid Xamarin.Firebase.Messaging Xamarin.Firebase.Common

可选 - Xamarin.Firebase.Analytics(用于分析)

【讨论】:

以上是关于尝试在空对象引用上调用虚拟方法 com.google.firebase.iid.FirebaseInstanceId.getInstanceId()'的主要内容,如果未能解决你的问题,请参考以下文章

尝试在空对象引用上调用虚拟方法 com.google.firebase.iid.FirebaseInstanceId.getInstanceId()'

NullPointerException 错误尝试在空对象引用上调用虚拟方法错误

Android错误尝试在空对象引用上调用虚拟方法[重复]

AsyncTask +数据库尝试在空对象引用上调用虚拟方法[重复]

数据库错误:尝试在空对象引用上调用虚拟方法“Cursor .getScene()”[重复]

尝试在空对象引用上调用虚拟方法 'android.view.SurfaceHolder android.view.SurfaceView.getHolder()'