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

Questions:

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.

Answers:

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";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(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")
            .build());
    // Indicate you're ready to receive media commands
    mediaSession.setActive(true);
    // 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
    mediaSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

    // Create a new Notification
    final Notification noti = new Notification.Builder(this)
            // Hide the timestamp
            .setShowWhen(false)
            // Set the Notification style
            .setStyle(new Notification.MediaStyle()
                    // Attach our MediaSession token
                    .setMediaSession(mediaSession.getSessionToken())
                    // Show our playback controls in the compat view
                    .setShowActionsInCompactView(0, 1, 2))
            // Set the Notification color
            .setColor(0xFFDB4437)
            // Set the large and small icons
            .setLargeIcon(artwork)
            .setSmallIcon(R.drawable.your_small_icon)
            // 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))
            .build();

    // 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);
            action.setComponent(serviceName);
            pendingIntent = PendingIntent.getService(this, 1, action, 0);
            return pendingIntent;
        case 2:
            // Skip tracks
            action = new Intent(ACTION_NEXT);
            action.setComponent(serviceName);
            pendingIntent = PendingIntent.getService(this, 2, action, 0);
            return pendingIntent;
        case 3:
            // Previous tracks
            action = new Intent(ACTION_PREV);
            action.setComponent(serviceName);
            pendingIntent = PendingIntent.getService(this, 3, action, 0);
            return pendingIntent;
        default:
            break;
    }
    return null;
}

Results

example