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