onMetadataChanged从未调用过MediaControllerCompat.Callback

问题描述 投票:7回答:3

我正在为一家广播电台开发一个简单的音频播放器应用程序。 我已成功制作了一个MediaBrowser并注册了一个回调来听取playBack-或metadata的变化。

var mediaBrowser : MediaBrowserCompat by Delegates.notNull()
mediaBrowser = MediaBrowserCompat(
        activity,
        ComponentName(activity, MediaPlaybackService::class.java),
        object : MediaBrowserCompat.ConnectionCallback() {
            override fun onConnected() {
                val mediaController = MediaControllerCompat(activity, mediaBrowser.sessionToken)
                MediaControllerCompat.setMediaController(activity, mediaController)
                mediaController.registerCallback(ControllerCallback)
                mediaControllerFunc()
            }
        },
        null
)

object ControllerCallback : MediaControllerCompat.Callback() {
    override fun onMetadataChanged(metadata: MediaMetadataCompat) {
        //TODO: Never called
    }

    override fun onPlaybackStateChanged(state: PlaybackStateCompat) {
        //Called
    }
}

我打电话时收到playback的变化

mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
            .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE)
            .setState(STATE_PLAYING, DEFAULT_PLAYBACK_POSITION, DEFAULT_PLAYBACK_SPEED)
            .build()
)

但元数据更改不是。 即使我打电话

mediaSession.setMetadata(
    MediaMetadataCompat.Builder()
        .putLong(METADATA_KEY_DURATION, -1)
        .putString(METADATA_KEY_TITLE, title)
        .putString(METADATA_KEY_ARTIST, artist)
        .putBitmap(METADATA_KEY_ALBUM_ART, albumCover)
        .putString(METADATA_KEY_ALBUM_ART_URI, albumCoverUrl)
        .build()
)

接收元数据更改时我缺少什么? 如果它可以帮助Github上提供完整的存储库

提前致谢

android audio android-mediaplayer android-mediasession
3个回答
2
投票

onPlaybackStateChanged适合我在26版之前的支持库。从那以后,我根本无法触发这个特定的回调。在onMetadataChanged强制更新后,onConnected()正常工作。一切都是Comppat类型。我查看了源代码,在onPlaybackStateChanged的情况下,它依赖于一些永远不会被触发的ExtraCallback

  @Override
        public void onPlaybackStateChanged(Object stateObj) {
            MediaControllerCompat.Callback callback = mCallback.get();
            if (callback != null) {
                if (callback.mHasExtraCallback) {
                    // Ignore. ExtraCallback will handle this.
                } else {
                    callback.onPlaybackStateChanged(
                            PlaybackStateCompat.fromPlaybackState(stateObj));
                }
            }
        }

我不确定它是否相关,但是这个ExtraCallback被弱引用,所以它可能会被丢失和收集。


1
投票

对于遇到同样问题的人,我的解决方案。

事实证明我正在混合使用compat(负责启动音频服务和连接到元数据的服务层)和API的非compat(UI层)变体。

特别是活动。 由于我瞄准棒棒糖和更高,我决定使用Activity而不是AppCompatActivity

这显然是默默地打破MediaControllerCompat.CallbackonMetadataChanged(),但不是为onPlaybackStateChanged()。 似乎无法找到原因?!

在代码中,它就像更改一样简单:

class PlayableActivity : Activity() { ... }

至:

class PlayableActivity : AppCompatActivity() { ... }


0
投票

好像你已经注册了MediaControllerCompat的回调,但从来没有打电话给onPlaybackStateChanged(mMediaController.getPlaybackState()) as in sample here

© www.soinside.com 2019 - 2024. All rights reserved.