onMetadataChanged MediaControllerCompat.Callback 从未调用过
onMetadataChanged MediaControllerCompat.Callback never called
我正在为广播电台开发一个简单的音频播放器应用程序。
我已成功创建 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
提前致谢
您似乎已经为 MediaControllerCompat
注册了回调,但从未调用 onPlaybackStateChanged(mMediaController.getPlaybackState())
as in sample here
我对遇到同样问题的人的解决方案。
原来我混合了 compat
(负责启动音频服务和连接到元数据的服务层)和非 compat
(UI 层)变体 API。
特别是 activity.
由于我的目标是 Lollipop 及更高版本,因此我决定使用 Activity
而不是 AppCompatActivity
。
这显然无声地破坏了 onMetadataChanged()
的 MediaControllerCompat.Callback
,但没有破坏 onPlaybackStateChanged()
。
好像找不到原因?!
在代码中,它就像更改一样简单:
class PlayableActivity : Activity() { ... }
至:
class PlayableActivity : AppCompatActivity() { ... }
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
被弱引用所以可能会丢失和收集。
我正在为广播电台开发一个简单的音频播放器应用程序。
我已成功创建 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
提前致谢
您似乎已经为 MediaControllerCompat
注册了回调,但从未调用 onPlaybackStateChanged(mMediaController.getPlaybackState())
as in sample here
我对遇到同样问题的人的解决方案。
原来我混合了 compat
(负责启动音频服务和连接到元数据的服务层)和非 compat
(UI 层)变体 API。
特别是 activity.
由于我的目标是 Lollipop 及更高版本,因此我决定使用 Activity
而不是 AppCompatActivity
。
这显然无声地破坏了 onMetadataChanged()
的 MediaControllerCompat.Callback
,但没有破坏 onPlaybackStateChanged()
。
好像找不到原因?!
在代码中,它就像更改一样简单:
class PlayableActivity : Activity() { ... }
至:
class PlayableActivity : AppCompatActivity() { ... }
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
被弱引用所以可能会丢失和收集。