FCM:无法实例化接收器com.google.firebase.iid.FirebaseInstanceIdReceiver:

时间:2018-05-17 13:27:45

标签: android firebase firebase-cloud-messaging android-8.0-oreo

仅在Oreo(8.0)中接收推送通知时,应用程序崩溃。

java.lang.RuntimeException: Unable to instantiate receiver com.google.firebase.iid.FirebaseInstanceIdReceiver: java.lang.ClassCastException: android.content.ContextWrapper cannot be cast to android.app.ContextImpl
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:3236)
        at android.app.ActivityThread.-wrap17(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)

4 个答案:

答案 0 :(得分:1)

使用书法库时,我遇到了同样的问题。当Firebase首次请求令牌时,即使在安装后第一次崩溃。不仅会收到推送通知。

我的错误是我正在重写Application类中的attachBaseContext方法以返回ContextWrapper对象,但仅在Activity中需要。

因此,恢复我的解决方案是在Application类中删除attachBaseContext并将其移动或将其放入活动中。

答案 1 :(得分:0)

这可能会有所帮助;如果使用的话,将它们添加到您的proguard中!

-dontwarn com.google.android.gms.**
-keep class com.google.android.gms.** { *; }
-keep class com.google.firebase.** { *; }

答案 2 :(得分:0)

为解决“无法实例化接收者”的问题,我在proguard.cfg中添加了上述行。我使用d8 Dex编译器和r8进行了代码收缩。但是问题没有解决。 因此,我将代码收缩器切换为proguard。但是,不再将ProGuard与d8 Dex编译器结合使用。因此,我将Dex编译器切换为dx。你猜怎么着?

问题已解决:该应用不再崩溃。

答案 3 :(得分:0)

我刚刚从attachBaseContext类中删除了Application

    override fun attachBaseContext(newBase: Context) {
    val lang: String = newBase.getSharedPreferences(SHARED_PREFS_NAME, Context.MODE_PRIVATE)
        .getString(KEY_LANG, ENGLISH) ?: ENGLISH
    super.attachBaseContext(ApplicationContextWrapper.wrap(newBase, lang))
}