Android - 如何更新 MediaSession 元数据以便歌曲更改反映在蓝牙连接的设备上?
Android - How to update MediaSession Metadata so song changes are reflected on bluetooth connected device?
播放器启动后,我将使用它来设置元数据。效果很好。
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putString(MediaMetadata.METADATA_KEY_ARTIST, Variables.currentArtist)
.putString(MediaMetadata.METADATA_KEY_TITLE, Variables.currentSong)
.build()
)
当流开始播放时,曲目信息会显示在连接的蓝牙设备的屏幕上,无论是 Echo Show 还是我汽车的信息娱乐系统。但是,一旦播放下一首歌曲,它就不会更新。我必须 stop/start 流才能更新。如何在不 stop/start 播放的情况下推送对元数据的更新?我每 5 秒将此调用与处理程序一起使用:
updateMetadata()
哪个调用了这个函数:
private fun updateMetadata() {
val largeIcon =
BitmapFactory.decodeResource(resources, com.rustfm.rustfm.R.drawable.album_art)
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, Variables.currentArtist)
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, Variables.currentSong)
.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, "Test Description")
.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, largeIcon)
.build()
)
}
每次我调用 updateMetadata() 函数时,我的回调 class 都会被触发,但我不确定从这里去哪里。感谢任何帮助或指导!
这是我的回电class:
private inner class MediaControllerCallback : MediaControllerCompat.Callback() {
override fun onMetadataChanged(metadata: MediaMetadataCompat?) {
// Where to go from here?
Log.d("Event Metadata", "Fired")
}
}
我没有完全进入这个话题,但也许我可以给你一些正确方向的指示。据我所知,连接到您的媒体会话的其他服务通过 MediaSessionConnector
.
接收信息
/**
* Creating a media session allows other parties to control the
* playing radio. For example, the lock screen can now display
* the net radio status and pause/resume it.
*/
private fun createMediaSession() {
mediaSession = MediaSessionCompat(this, MEDIA_SESSION_TAG)
mediaSession.isActive = true
playerNotificationManager.setMediaSessionToken(mediaSession.sessionToken)
mediaSessionConnector = MediaSessionConnector(mediaSession)
mediaSessionConnector.setQueueNavigator(object : TimelineQueueNavigator(mediaSession) {
override fun getMediaDescription(player: Player, windowIndex: Int): MediaDescriptionCompat {
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.bg_radio_notification)
return MediaDescriptionCompat.Builder()
.setTitle(getString(R.string.net_radio_channel_name))
.setSubtitle(notificationSubtitle)
.setDescription(getString(R.string.radio_channel_description))
.setExtras(bundleOf(METADATA_KEY_ARTIST to notificationSubtitle)) // for Samsung lock screen
.setIconBitmap(bitmap)
.build()
}
})
mediaSessionConnector.setPlayer(player)
}
如果这不是您要搜索的内容,我总是建议您仔细阅读 Google 的通用音频播放器的参考实现:https://github.com/android/uamp
另外,非常推荐使用 exoplayer 作为您的播放器,而不是自己实现整个播放器。 Exoplayer 将为您卸下繁重的实现细节。
好吧,如果有人读到这篇文章有同样的问题,我的整个问题是我根本没有在代码中设置播放状态。哎呀。当我将 PlaybackStateCompat 分配给我的 MediaSession 时,元数据开始正确显示和更新。我不知何故完全忘记设置它。
播放器启动后,我将使用它来设置元数据。效果很好。
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putString(MediaMetadata.METADATA_KEY_ARTIST, Variables.currentArtist)
.putString(MediaMetadata.METADATA_KEY_TITLE, Variables.currentSong)
.build()
)
当流开始播放时,曲目信息会显示在连接的蓝牙设备的屏幕上,无论是 Echo Show 还是我汽车的信息娱乐系统。但是,一旦播放下一首歌曲,它就不会更新。我必须 stop/start 流才能更新。如何在不 stop/start 播放的情况下推送对元数据的更新?我每 5 秒将此调用与处理程序一起使用:
updateMetadata()
哪个调用了这个函数:
private fun updateMetadata() {
val largeIcon =
BitmapFactory.decodeResource(resources, com.rustfm.rustfm.R.drawable.album_art)
mediaSession.setMetadata(
MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, Variables.currentArtist)
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, Variables.currentSong)
.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION, "Test Description")
.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, largeIcon)
.build()
)
}
每次我调用 updateMetadata() 函数时,我的回调 class 都会被触发,但我不确定从这里去哪里。感谢任何帮助或指导!
这是我的回电class:
private inner class MediaControllerCallback : MediaControllerCompat.Callback() {
override fun onMetadataChanged(metadata: MediaMetadataCompat?) {
// Where to go from here?
Log.d("Event Metadata", "Fired")
}
}
我没有完全进入这个话题,但也许我可以给你一些正确方向的指示。据我所知,连接到您的媒体会话的其他服务通过 MediaSessionConnector
.
/**
* Creating a media session allows other parties to control the
* playing radio. For example, the lock screen can now display
* the net radio status and pause/resume it.
*/
private fun createMediaSession() {
mediaSession = MediaSessionCompat(this, MEDIA_SESSION_TAG)
mediaSession.isActive = true
playerNotificationManager.setMediaSessionToken(mediaSession.sessionToken)
mediaSessionConnector = MediaSessionConnector(mediaSession)
mediaSessionConnector.setQueueNavigator(object : TimelineQueueNavigator(mediaSession) {
override fun getMediaDescription(player: Player, windowIndex: Int): MediaDescriptionCompat {
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.bg_radio_notification)
return MediaDescriptionCompat.Builder()
.setTitle(getString(R.string.net_radio_channel_name))
.setSubtitle(notificationSubtitle)
.setDescription(getString(R.string.radio_channel_description))
.setExtras(bundleOf(METADATA_KEY_ARTIST to notificationSubtitle)) // for Samsung lock screen
.setIconBitmap(bitmap)
.build()
}
})
mediaSessionConnector.setPlayer(player)
}
如果这不是您要搜索的内容,我总是建议您仔细阅读 Google 的通用音频播放器的参考实现:https://github.com/android/uamp
另外,非常推荐使用 exoplayer 作为您的播放器,而不是自己实现整个播放器。 Exoplayer 将为您卸下繁重的实现细节。
好吧,如果有人读到这篇文章有同样的问题,我的整个问题是我根本没有在代码中设置播放状态。哎呀。当我将 PlaybackStateCompat 分配给我的 MediaSession 时,元数据开始正确显示和更新。我不知何故完全忘记设置它。