AbstractMethodError: abstract method "void android.media.RemoteController$OnClientUpdateListener.onClientSessionEvent

AbstractMethodError: abstract method "void android.media.RemoteController$OnClientUpdateListener.onClientSessionEvent

我的 Android 应用程序在三款特定的三星机型上生产时出现奇怪的崩溃。它抱怨我没有覆盖标准 Android 平台中不存在的抽象方法 onNewSessionEventhttp://developer.android.com/reference/android/media/RemoteController.OnClientUpdateListener.html

Fatal Exception: java.lang.AbstractMethodError: abstract method "void android.media.RemoteController$OnClientUpdateListener.onClientSessionEvent(java.lang.String, android.os.Bundle)"
   at android.media.RemoteController.onNewSessionEvent(RemoteController.java:1208)
   at android.media.RemoteController.access00(RemoteController.java:61)
   at android.media.RemoteController$MediaControllerCallback.onSessionEvent(RemoteController.java:851)
   at android.media.session.MediaController$MessageHandler.handleMessage(MediaController.java:1073)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:145)
   at android.app.ActivityThread.main(ActivityThread.java:6117)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

这三个型号是 Galaxy S5(AT&T 和 Sprint)和 S6 Edge(T-mobile),都在 5.x。我没有这些设备,所以当然无法在本地重现和排除故障。

我的代码确实使用了在 RemoteController 上注册的 OnClientUpdateListener,但仅此而已。

有什么想法吗?

RemoteController source code, AOSP's MediaControllerCallback (used to provide backward compatibility between the new media session APIs added in Lollipop with the deprecated RemoteController) only implements onPlaybackStateChanged() and onMetadataChanged() 中所见。

似乎在那些设备上,API 一直在默默地 'augmented' 尝试处理 onSessionEvent() as well. Unfortunately, one downside of interfaces is that all methods must be implemented so adding new APIs often breaks existing implementations (see ComponentCallbacks2 例如)。

如果您想继续在这些 Lollipop 设备上使用 RemoteController. OnClientUpdateListener,解决方案很明显:实施该方法。您现在知道方法签名是什么,因此实现该方法(使用空主体)将删除此错误消息。如果他们希望您的 OnClientUpdateListener 具有其他方法,您肯定 运行 会陷入其他错误(MediaController.Callback 中有很多其他方法未反映在 public APIs 在 OnClientUpdateListener)。我强烈建议您在再次发布应用程序之前找一台真实的设备来测试您更新后的 OnClientUpdateListener

另一种解决方案是使用两个单独的 NotificationListenerServices - one for KitKat alone (and would implement OnClientUpdateListener) and a separate one for Lollipop and above that would not. This would allow you to use the Lollipop media playback control APIs and MediaController APIs on Lollipop and above (by reading the Token from EXTRA_MEDIA_SESSION),同时保持 KitKat 兼容性。