Search code examples
javaandroidnotificationsandroid-notificationsandroid-notification.mediastyle

Media Style Notification action buttons not working with PendingIntent.getBroadcast()


I am creating a music player with notification style by using NotificationCompat.MediaStyle().

I implemented my code to send a broadcast when the action buttons are clicked in my notification. But my code doesn't seems to work.

Here's my code as follows:

NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
            .setShowWhen(false)
            // Set the Notification style
            .setStyle(new NotificationCompat.MediaStyle()
                      // Attach our MediaSession token
                      .setMediaSession(mediaSession.getSessionToken())
                      // Show our playback controls in the compact notification view.
                      .setShowActionsInCompactView(0, 1, 2))
            // Set the Notification color
            .setColor(getResources().getColor(R.color.colorPrimary))
            // Set the large and small icons
            .setLargeIcon(largeIcon)
            .setSmallIcon(android.R.drawable.stat_sys_headset)
            // Set Notification content information
            .setContentText("Artist Name")
            .setContentTitle("Album name")
            .setContentInfo("Title name")
            // Add playback actions
            .addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3))
            .addAction(notificationAction, "pause", play_pauseAction)
            .addAction(android.R.drawable.ic_media_next, "next", playbackAction(2));

((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).notify(NOTIFICATION_ID, notificationBuilder.build());

Method playBackAction() is as follows:

private PendingIntent playbackAction(int actionNumber){

        Intent playbackAction;

        switch(actionNumber){
        case 0:
            // Play
            playbackAction = new Intent(BROADCAST_PLAYBACK);
            playbackAction.setAction(ACTION_PLAY);

            return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
        case 1:
            // Pause
            playbackAction = new Intent(BROADCAST_PLAYBACK);
            playbackAction.setAction(ACTION_PAUSE);

            return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
        case 2:
            // Next track
            playbackAction = new Intent(BROADCAST_PLAYBACK);
            playbackAction.setAction(ACTION_NEXT);

            return PendingIntent.getService(this, actionNumber, playbackAction, 0);
        case 3:
            // Previous track
            playbackAction = new Intent(BROADCAST_PLAYBACK);
            playbackAction.setAction(ACTION_PREVIOUS);

            return PendingIntent.getBroadcast(this, actionNumber, playbackAction, 0);
        default:
            break;
        }
        return null;
    }

My BroadcastReceiver is as follows:

BroadcastReceiver broadCastPlayback=new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent)
        {
            // TODO: Implement this method

            showToast("onReceive");
        }
    };

I registered the broadcast receiver in onCreate of the android service

IntentFilter filter=new IntentFilter(BROADCAST_PLAYBACK);
registerReceiver(broadCastPlayback,filter);

The showToast() method inside onReceive is not called. I wonder whether the broadcast is not sent or it is not received.


Solution

  • The problem you are having is that the filter is lacking the actions that are being sent in the pending intents.

    For example: .addAction(android.R.drawable.ic_media_previous, "previous", playbackAction(3)) will send the action ACTION_PREVIOUS

    but the boradcast receiver is filtering only on BROADCAST_PLAYBACK

    To the filter you need to add (or replace BROADCAST_PLAYBACK with) the missing actions.

    Following the example:

    filter.addAction(ACTION_PREVIOUS);
    

    In the same way add the other actions you have definied.