Home » Java » Media style notification not working after update to Android 5.0

Media style notification not working after update to Android 5.0

Posted by: admin December 28, 2021 Leave a comment


I tried implementing the Media Style Notification using this link. However when I recently updated to Android 5.0 SDK, the createSession method is not working.

mMediaPlayer = new MediaPlayer();
mManager = (MediaSessionManager) getSystemService(Context.MEDIA_SESSION_SERVICE);
mSession = mManager.createSession("sample session"); //shows compile error
mController = MediaController.fromToken( mSession.getSessionToken() );

Is there any other method that needs to be used? When I checked the change log, it said that createSession is no longer used. What are the alternatives then for implementing such media style notifications.


You no longer use MediaController.fromToken, but instead MediaSessin.getController.
And you no longer use MediaSessionManager.createSession, but instead just create a new MediaSession object and MediaSession.getSessionToken to retrieve your MediaSession.Token.

A very basic example implementation might be something like:

private static final String ACTION_TOGGLE_PLAYBACK = "com.your.package.name.TOGGLE_PLAYBACK";
private static final String ACTION_PREV = "com.your.package.name.PREV";
private static final String ACTION_NEXT = "com.your.package.name.NEXT";

protected void onCreate(Bundle savedInstanceState) {

    final Bitmap artwork = ...;

    // Create a new MediaSession
    final MediaSession mediaSession = new MediaSession(this, "debug tag");
    // Update the current metadata
    mediaSession.setMetadata(new MediaMetadata.Builder()
            .putBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART, artwork)
            .putString(MediaMetadata.METADATA_KEY_ARTIST, "Pink Floyd")
            .putString(MediaMetadata.METADATA_KEY_ALBUM, "Dark Side of the Moon")
            .putString(MediaMetadata.METADATA_KEY_TITLE, "The Great Gig in the Sky")
    // Indicate you're ready to receive media commands
    // Attach a new Callback to receive MediaSession updates
    mediaSession.setCallback(new MediaSession.Callback() {

        // Implement your callbacks

    // Indicate you want to receive transport controls via your Callback

    // Create a new Notification
    final Notification noti = new Notification.Builder(this)
            // Hide the timestamp
            // Set the Notification style
            .setStyle(new Notification.MediaStyle()
                    // Attach our MediaSession token
                    // Show our playback controls in the compat view
                    .setShowActionsInCompactView(0, 1, 2))
            // Set the Notification color
            // Set the large and small icons
            // Set Notification content information
            .setContentText("Pink Floyd")
            .setContentInfo("Dark Side of the Moon")
            .setContentTitle("The Great Gig in the Sky")
            // Add some playback controls
            .addAction(R.drawable.your_prev_icon, "prev", retreivePlaybackAction(3))
            .addAction(R.drawable.your_pause_icon, "pause", retreivePlaybackAction(1))
            .addAction(R.drawable.your_next_icon, "next", retreivePlaybackAction(2))

    // Do something with your TransportControls
    final TransportControls controls = mediaSession.getController().getTransportControls();

    ((NotificationManager) getSystemService(NOTIFICATION_SERVICE)).notify(1, noti);

private PendingIntent retreivePlaybackAction(int which) {
    Intent action;
    PendingIntent pendingIntent;
    final ComponentName serviceName = new ComponentName(this, YourPlaybackService.class);
    switch (which) {
        case 1:
            // Play and pause
            action = new Intent(ACTION_TOGGLE_PLAYBACK);
            pendingIntent = PendingIntent.getService(this, 1, action, 0);
            return pendingIntent;
        case 2:
            // Skip tracks
            action = new Intent(ACTION_NEXT);
            pendingIntent = PendingIntent.getService(this, 2, action, 0);
            return pendingIntent;
        case 3:
            // Previous tracks
            action = new Intent(ACTION_PREV);
            pendingIntent = PendingIntent.getService(this, 3, action, 0);
            return pendingIntent;
    return null;