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

8

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

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener() {
           @Override
           public void onSuccess(InstanceIdResult instanceIdResult) {
               String token = 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();
    }

可能的问题是什么?
3个回答

14

合并清单文件时出现问题,以下服务在合并后的清单文件中缺失。将其添加到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>

现在一切都正常运行。


它对我来说仍然崩溃。有什么建议吗? - SKP
对我来说,它仍然崩溃了,有什么建议吗? - creativecoder
@所有人,我将告诉你我是如何解决这个问题的。我创建了一个示例项目,并使用了Firebase消息库,然后比较了示例项目和我的原始项目的合并清单。你也可以这样做,找出两者之间缺少的内容,将缺失的条目添加到你的原始项目中,这样就可以解决问题了。 - alphaguy
1
无法在onMesssageRecieve中接收通知 我使用了上面相同的代码 - Prasad
@SanjeevKumar 请尝试创建一个示例应用程序,并比较合并的清单,以查看是否缺少任何条目。 - alphaguy
显示剩余3条评论

0

在合并 .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>

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

  • 注意:您可能需要在ApplicationClassonCreate中添加FirebaseApp.initializeApp(this);

    public class MyApplicationClass extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseApp.initializeApp(this);
    }
    

0

您需要添加以下软件包:

  1. Xamarin.Firebase.Lid
  2. Xamarin.Firebase.Messaging
  3. Xamarin.Firebase.Common

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接