仅在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)
答案 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))
}