skip to Main Content

I have implemented android notifications in android studio. I was creating notification for a media player. following is the function for showing notifications

public void showNotification(int playPauseBtn)
{
Intent intent = new Intent(this, PlayerActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);

Intent prevIntent = new Intent(this, NotificationReceiver.class).setAction(ACTION_PREVIOUS);
PendingIntent prevPending = PendingIntent.getBroadcast(this, 0, prevIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Intent pauseIntent = new Intent(this, NotificationReceiver.class).setAction(ACTION_PLAY);
PendingIntent pausePending = PendingIntent.getBroadcast(this, 0, pauseIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Intent nextIntent = new Intent(this, NotificationReceiver.class).setAction(ACTION_NEXT);
PendingIntent nextPending = PendingIntent.getBroadcast(this, 0, nextIntent, PendingIntent.FLAG_UPDATE_CURRENT);

byte[] picture = null;
try
{
    picture = getAlbumArt(listSongs.get(position).getPath());
} catch (Exception ignored)
{
}

Bitmap thumb;
if (picture != null)
{
    thumb = BitmapFactory.decodeByteArray(picture, 0, picture.length);
} else
{
    thumb = BitmapFactory.decodeResource(getResources(), R.drawable.icon_music);
}
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID_1).setSmallIcon(playPauseBtn)
        .setLargeIcon(thumb)
        .setContentTitle(listSongs.get(position).getTitle())
        .setContentText(listSongs.get(position).getArtist())
        .addAction(R.drawable.ic_baseline_skip_previous_24, "Previous", prevPending)
        .addAction(R.drawable.ic_baseline_skip_next_24, "Next", nextPending)
        .addAction(playPauseBtn, "pause", pausePending)
        .setStyle(new androidx.media.app.NotificationCompat.MediaStyle().setMediaSession(mediaSessionCompat.getSessionToken()))
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setOnlyAlertOnce(true)
        .setContentIntent(contentIntent)
        .build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0, notification);
Toast.makeText(PlayerActivity.this, "Nitification created", Toast.LENGTH_SHORT).show();

}

In the function parameter (playPauseBtn) I am sending the play icon or the pause icon depending upon weather the song is playing or is paused.

Function call is made like following:

showNotification(R.drawable.ic_baseline_pause_24);

OR

showNotification(R.drawable.ic_baseline_play_arrow_24);

But when ever I call this function the notification doesn’t show up. I am also using the notification channel but still it is not working. I have also tried to debug the code but the code runs fine, still the notification doesn’t show up. please advise

2

Answers


  1. Chosen as BEST ANSWER

    FIX

    Donot use .setMediaSession(mediaSessionCompat.getSessionToken()) in .setStyle() in the code given in the question

    simply just use

     .setStyle(new androidx.media.app.NotificationCompat.MediaStyle())
    

  2. try this.

    put this code in your Activity/fragment;

        public void getNotification(){
        
        int notifId =new Random().nextInt(500);   //get random id
        NotificationManager notificationManager;
        Notification notification;
        notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            channelID = "1";
            channelName = "news";
            channelDesc = "news description";
            NotificationChannel notificationChannel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
            notificationChannel.setDescription(channelDesc);
            notificationChannel.enableLights(true);
            notificationChannel.setSound(null, null);
            notificationChannel.setLightColor(Color.GREEN);
            notificationManager.createNotificationChannel(notificationChannel);
    
        }
    
        RingtoneManager.getRingtone(mContext,
                RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)).play();
    
        NotificationCompat.Builder   builder = new NotificationCompat.Builder(mContext, channelID)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("title Of MUSIC")
                .setContentText("Content")
                .setVibrate(new long[]{100, 500, 500, 500, 500})
                .setAutoCancel(true)
                .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.mipmap.ic_launcher))
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
    
        Intent actionReadMessage = new Intent(mContext, NotifAction.class);
        actionReadMessage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        actionReadMessage.setAction("Play");
       actionReadMessage.putExtra("NotifId",notifId);
        PendingIntent playPendingIntent = PendingIntent.getBroadcast(mContext, notifId, actionReadMessage,PendingIntent.FLAG_CANCEL_CURRENT);
    
    
    
    
        Intent mainAction = new Intent(mContext, NotifAction.class);
        mainAction.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        mainAction.setAction("Pause");
        mainAction.putExtra("NotifId",notifId);
        PendingIntent PausePendingIntent = PendingIntent.getBroadcast(mContext, notifId, mainAction,PendingIntent.FLAG_CANCEL_CURRENT);
    
        
    
        builder.setContentIntent(PausePendingIntent);
        builder.addAction(R.mipmap.ic_launcher, "Play", playPendingIntent);
        builder.addAction(R.mipmap.ic_launcher, "Pause", PausePendingIntent);
        
        notification = builder.build();
        notificationManager.notify(notifId,  notification);
        
    
        }
    

    and create class NotifAction.class for handle all action:

    public class NotifAction extends BroadcastReceiver {
    
    private static final String TAG = "maybe";
    private MediaPlayer mp;
    @Override
    public void onReceive(final Context context, Intent intent) {
    
        String action = intent.getAction();
        Bundle extra = intent.getExtras();
    
        if (extra != null) {
            int notifId = extra.getInt("NotifId");
            if (action.equals("Play")) {
                mp = MediaPlayer.create(context, R.raw.music);
                handleMusicState(mp);
            } else if (action.equals("Pause")) {
    
                handleMusicState(mp);
                setMessageRead(notifId, context);
    
            } else {
                Toast.makeText(context, "extra  action !", Toast.LENGTH_SHORT).show();
            }
    
        } else {
            Toast.makeText(context, "Empty extra !", Toast.LENGTH_SHORT).show();
        }
        }
    
    
    private void setMessageRead(int id, Context context) {
        //  other  method
        clearNotification(id, context);
    
       }
    
    private void clearNotification(int id, Context context) {
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.cancel(id);
       }
    
    private void handleMusicState(MediaPlayer mediaPlayer) {
        if (mediaPlayer.isPlaying()) mediaPlayer.pause();
        else mediaPlayer.start();
    
        }
       }
    

    define this receiver to manifest:
    note:in tag

     <receiver android:name=".NotifAction">
            <intent-filter>
                <action android:name="Play" />
                <action android:name="Pause" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search