3

3 つの特定の Samsung モデルの 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)

3 つのモデルは、Galaxy S5 (AT&T および Sprint) と S6 Edge (T-mobile) で、すべて 5.x です。私はこれらのデバイスを持っていないので、もちろんローカルで再現してトラブルシューティングすることはできません。

私のコードは にOnClientUpdateListener登録された を使用していますRemoteControllerが、これは理にかなっている限りです。

何か案は?

4

1 に答える 1

2

RemoteController ソース コードに見られるように、AOSP MediaControllerCallback(非推奨の Lollipop に追加された新しいメディア セッション API との間の後方互換性を提供するために使用される) は、 onPlaybackStateChanged ()onMetadataChanged(RemoteController ) のみを実装します。

これらのデバイスでは、 onSessionEvent()も処理しようとして、API が静かに「拡張」されているようです。残念ながら、インターフェイスの欠点の 1 つは、すべてのメソッドを実装する必要があるため、新しい API を追加すると既存の実装が壊れることが多いことです (例については、 ComponentCallbacks2を参照してください)。

これらの Lollipop デバイスで引き続き使用RemoteController. OnClientUpdateListenerしたい場合の解決策は明らかです。メソッドを実装することです。メソッドのシグネチャが何であるかがわかったので、(空の本体で) メソッドを実装すると、このエラー メッセージが表示されなくなります。追加のメソッドが必要な場合は、追加のエラーが発生する可能性があります( MediaController.Callbackには、パブリック API に反映されていない追加のメソッドOnClientUpdateListenerがかなりあります)。アプリを再度公開する前に、実際のデバイスを見つけて更新をテストすることを強くお勧めします。OnClientUpdateListenerOnClientUpdateListener

別の解決策は、2 つの別個のNotificationListenerServiceを使用することです。1 つは KitKat のみ (および を実装するOnClientUpdateListener) 用で、もう 1 つは Lollipop 以降では使用されません。これにより、 KitKat との互換性を維持しながら、( EXTRA_MEDIA_SESSIONからを読み取ることにより) Lollipop 以降でLollipop メディア再生コントロール APIMediaController APIを使用できるようになります。Token

于 2015-12-18T17:52:15.580 に答える