首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onMetadataChanged MediaControllerCompat.Callback从未打过电话

onMetadataChanged MediaControllerCompat.Callback从未打过电话
EN

Stack Overflow用户
提问于 2017-11-14 18:03:28
回答 3查看 2.9K关注 0票数 9

我正在为一个电台开发一个简单的音频播放器应用程序。

我已经成功地创建了一个MediaBrowser,并注册了一个回调以侦听playBack-或metadata更改。

代码语言:javascript
复制
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时,会收到这些更改

代码语言:javascript
复制
mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
            .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE)
            .setState(STATE_PLAYING, DEFAULT_PLAYBACK_POSITION, DEFAULT_PLAYBACK_SPEED)
            .build()
)

然而,元数据更改不是。

即使我打电话

代码语言:javascript
复制
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上使用。

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-08 17:38:17

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

结果,我将compat (负责启动音频服务和元数据连接的服务层)和非compat (UI层)变体混合在一起。

特别是活动。

由于我的目标是棒棒糖和更高,我决定使用Activity而不是AppCompatActivity

这显然会悄悄地破坏onMetadataChanged()onMetadataChanged(),而不是onPlaybackStateChanged()

似乎找不到原因了!

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

class PlayableActivity : Activity() { ... }

至:

class PlayableActivity : AppCompatActivity() { ... }

票数 2
EN

Stack Overflow用户

发布于 2017-12-21 13:47:44

对于我来说,在26版之前,onPlaybackStateChanged正确地为支持库工作。从那时起,我就不能让它触发这个特定的回调了。在对onMetadataChanged进行强制更新后,onConnected()工作正常。所有东西都是Comppat类型的。我查看了源代码,在onPlaybackStateChanged的例子中,它依赖于一些从未触发的ExtraCallback

代码语言:javascript
复制
  @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是弱引用的,所以它可能会被丢失和收集。

票数 2
EN

Stack Overflow用户

发布于 2017-11-24 15:12:18

似乎您已为MediaControllerCompat注册了回调,但从未打过onPlaybackStateChanged(mMediaController.getPlaybackState()) 就像这里的样本

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47292459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档