AbstractMethodError:抽象方法“void android.media.RemoteController $ OnClientUpdateListener.onClientSessionEvent

时间:2015-12-18 17:01:44

标签: android android-mediasession

我的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.access$1000(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.我没有这些设备,所以当然我无法在本地重现和排除故障。

我的代码确实使用OnClientUpdateListener上注册的RemoteController,但这是有道理的。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

RemoteController source code所示,AOSP的MediaControllerCallback(用于提供Lollipop中添加的新媒体会话API与不推荐使用的RemoteController之间的向后兼容性)仅实现onPlaybackStateChanged()onMetadataChanged()

似乎在这些设备上,API也在试图处理onSessionEvent()时被静默“扩充”。不幸的是,接口的一个缺点是必须实现所有方法,因此添加新API通常会破坏现有实现(例如,请参阅ComponentCallbacks2)。

如果您想继续在这些Lollipop设备上使用RemoteController. OnClientUpdateListener,解决方案显而易见:实施该方法。您现在知道方法签名是什么,因此实现该方法(使用空主体)将删除此错误消息。如果他们期望您的OnClientUpdateListener有其他方法,则可能会遇到其他错误(MediaController.Callback中有很多其他方法未在OnClientUpdateListener的公共API中反映出来)。我强烈建议您在再次发布应用之前找一个真实的设备来测试更新的OnClientUpdateListener

另一种解决方案是使用两个单独的NotificationListenerService - 一个用于KitKat(并且将实现OnClientUpdateListener),另一个用于Lollipop,而不是。这样,您就可以在Lollipop及更高版本上使用Lollipop media playback control APIsMediaController API(通过阅读EXTRA_MEDIA_SESSION中的Token),同时保持KitKat的兼容性。