当前位置: 首页 > 知识库问答 >
问题:

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

祝叶五
2023-03-14

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

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener() {
           @Override
           public void onSuccess(InstanceIdResult instanceIdResult) {
               String token = instanceIdResult.getToken();
               // print token
           }
       });

应用程序在发布时崩溃

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>

Build.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();
    }

会有什么问题?

共有2个答案

龚博涛
2023-03-14

我在合并.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消息传递仍然无法工作,因为接收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中的OnCreate处添加FirebaseApp.InitializeApp(this);

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

  • 张瀚漠
    2023-03-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>
    

    现在一切正常。

     类似资料: