我的Android应用程序在三个特定的三星型号上的生产中出现了奇怪的崩溃。它抱怨我没有覆盖标准Android平台中不存在的抽象方法onNewSessionEvent
:
http://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
,但这是有道理的。
有什么想法吗?
答案 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 APIs和MediaController API(通过阅读EXTRA_MEDIA_SESSION中的Token
),同时保持KitKat的兼容性。