尝试在空对象引用上调用虚拟方法 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
库并尝试在应用启动时使用以下方法获取令牌。
应用程序在启动时崩溃
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 错误尝试在空对象引用上调用虚拟方法错误
AsyncTask +数据库尝试在空对象引用上调用虚拟方法[重复]
数据库错误:尝试在空对象引用上调用虚拟方法“Cursor .getScene()”[重复]
尝试在空对象引用上调用虚拟方法 'android.view.SurfaceHolder android.view.SurfaceView.getHolder()'