Search code examples
androidaudioandroid-mediaplayerandroid-mediasession

onMetadataChanged MediaControllerCompat.Callback never called


I'm developing a simple Audio Player app for a radio station.
I have successfully made a MediaBrowser and registered a callback to listen for playBack- or metadata changes.

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
    }
}

The playback changes are received when I call

mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder()
            .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE)
            .setState(STATE_PLAYING, DEFAULT_PLAYBACK_POSITION, DEFAULT_PLAYBACK_SPEED)
            .build()
)

However metadata changes are not.
Even though I call

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()
)

What am I missing to receive metadata changes?
If it can help the complete repository is available on Github

Thanks in advance


Solution

  • My solution for anybody experiencing the same problem.

    It turned out I was mixing compat (service layer responsible for starting the audio service and connection to metadata) and non compat (UI layer) variants of the API.

    In particular the activity.
    Since I am targeting Lollipop and higher I decided to use Activity instead of the AppCompatActivity.

    This apparently silently breaks the MediaControllerCompat.Callback for onMetadataChanged(), but not for onPlaybackStateChanged().
    Can't seem to find why?!

    In code it is as simple as changing:

    class PlayableActivity : Activity() { ... }

    to:

    class PlayableActivity : AppCompatActivity() { ... }