3

我在三个特定三星型号上的 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(T-mobile),都在 5.x 上。我没有这些设备,所以我当然无法在本地复制和排除故障。

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

有任何想法吗?

4

1 回答 1

2

RemoteController 源代码中可以看出,AOSP MediaControllerCallback(用于在 Lollipop 中添加的新媒体会话 API 与已弃用的 API 之间提供向后兼容性RemoteController)仅实现onPlaybackStateChanged()onMetadataChanged()

似乎在这些设备上,API 已经被默默地“增强”,并尝试处理onSessionEvent()。不幸的是,接口的一个缺点是必须实现所有方法,因此添加新的 API 通常会破坏现有的实现(参见ComponentCallbacks2示例)。

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

另一种解决方案是使用两个单独的NotificationListenerService s - 一个用于 KitKat 单独(并将实现OnClientUpdateListener),另一个用于 Lollipop 及更高版本则不会。这将允许您在 Lollipop 及更高版本上使用Lollipop 媒体播放控制 APIMediaController API(通过TokenEXTRA_MEDIA_SESSION读取),同时保持 KitKat 兼容性。

于 2015-12-18T17:52:15.580 回答