我的Android应用程序在三星三款手机上的生产出现了一次奇怪的崩溃。它在抱怨我没有覆盖抽象方法onNewSessionEvent
,它不存在于标准的Android平台: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 (),它们都在5.x上。我没有这些设备,所以我当然不能在本地复制和排除故障。
我的代码确实使用了在OnClientUpdateListener
上注册的RemoteController
,但这是合理的。
有什么想法吗?
发布于 2015-12-18 17:52:15
从RemoteController源代码中可以看出,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和更高版本上使用棒棒糖媒体播放控制API和MediaController API(通过从会议读取Token
),同时保持KitKat兼容性。
https://stackoverflow.com/questions/34360478
复制相似问题