我正在为一个电台开发一个简单的音频播放器应用程序。
我已经成功地创建了一个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上使用。
提前感谢
发布于 2017-12-08 17:38:17
我对遇到同样问题的人的解决方案。
结果,我将compat (负责启动音频服务和元数据连接的服务层)和非compat (UI层)变体混合在一起。
特别是活动。
由于我的目标是棒棒糖和更高,我决定使用Activity而不是AppCompatActivity。
这显然会悄悄地破坏onMetadataChanged()的onMetadataChanged(),而不是onPlaybackStateChanged()。
似乎找不到原因了!
在代码中,它就像更改一样简单:
class PlayableActivity : Activity() { ... }
至:
class PlayableActivity : AppCompatActivity() { ... }
发布于 2017-12-21 13:47:44
对于我来说,在26版之前,onPlaybackStateChanged正确地为支持库工作。从那时起,我就不能让它触发这个特定的回调了。在对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是弱引用的,所以它可能会被丢失和收集。
发布于 2017-11-24 15:12:18
似乎您已为MediaControllerCompat注册了回调,但从未打过onPlaybackStateChanged(mMediaController.getPlaybackState()) 就像这里的样本
https://stackoverflow.com/questions/47292459
复制相似问题