1

一旦播放器启动,我就使用它来设置元数据。这很好用。

mediaSession.setMetadata(
                MediaMetadataCompat.Builder()
                    .putString(MediaMetadata.METADATA_KEY_ARTIST, Variables.currentArtist)
                    .putString(MediaMetadata.METADATA_KEY_TITLE, Variables.currentSong)
                    .build()
            )

当流开始播放时,曲目信息会显示在连接的蓝牙设备的屏幕上,无论它是 Echo Show 还是我汽车的信息娱乐系统。但是,一旦播放下一首歌曲,它就不会更新。我必须停止/启动流才能更新。如何在无需停止/开始播放的情况下将更新推送到元数据?我每 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() 函数时,我的回调类都会被触发,但我不确定从这里去哪里。任何帮助或指导表示赞赏!

这是我的回调班:

private inner class MediaControllerCallback : MediaControllerCompat.Callback() {

    override fun onMetadataChanged(metadata: MediaMetadataCompat?) {

        // Where to go from here?
        Log.d("Event Metadata", "Fired")
    }
}
4

2 回答 2

0

我没有完全进入这个话题,但也许我可以给你一些正确方向的指示。据我记得,连接到您的媒体会话的其他服务通过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 将为您卸下大量的实现细节。

于 2021-07-25T12:00:38.880 回答
0

好吧,如果有人读到这个有同样的问题,我的整个问题是我根本没有在代码中设置播放状态。哎呀。在我为 MediaSession 分配 PlaybackStateCompat 的那一刻,元数据开始正确显示和更新。我不知何故完全忘记了设置。

于 2021-07-26T18:45:57.843 回答