Display media player notification

-1

I have successfully been able to stream MP3 from server in my and now i want to display a media player notification with controls when the song starts to play. I have followed some tutorials on how to do that but I am still getting errors when trying to do same in my app.

this is how i try to show notification when music starts to play

  playBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (!mediaPlayer.isPlaying()) {
                mediaPlayer.start();
                playBtn.setImageResource(R.drawable.music_play_24dp);

                startService(view);

            }
            else {
                mediaPlayer.pause();
                playBtn.setImageResource(R.drawable.music_stop_24dp);

            }
        }
    });
}

public void startService(View v) {
    Intent serviceIntent = new Intent(DetailActivity.this, NotificationService.class);
    serviceIntent.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
    startService(serviceIntent);
}

and this is my full NotificationService.class

public class NotificationService extends Service {

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) {
        showNotification();
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();

    } else if (intent.getAction().equals(Constants.ACTION.PREV_ACTION)) {
        Toast.makeText(this, "Clicked Previous", Toast.LENGTH_SHORT).show();
        Log.i(LOG_TAG, "Clicked Previous");
    } else if (intent.getAction().equals(Constants.ACTION.PLAY_ACTION)) {
        Toast.makeText(this, "Clicked Play", Toast.LENGTH_SHORT).show();
        Log.i(LOG_TAG, "Clicked Play");
    } else if (intent.getAction().equals(Constants.ACTION.NEXT_ACTION)) {
        Toast.makeText(this, "Clicked Next", Toast.LENGTH_SHORT).show();
        Log.i(LOG_TAG, "Clicked Next");
    } else if (intent.getAction().equals(
            Constants.ACTION.STOPFOREGROUND_ACTION)) {
        Log.i(LOG_TAG, "Received Stop Foreground Intent");
        Toast.makeText(this, "Service Stoped", Toast.LENGTH_SHORT).show();
        stopForeground(true);
        stopSelf();
    }
    return START_STICKY;
}

Notification status;
private final String LOG_TAG = "NotificationService";

private void showNotification() {

    RemoteViews views = new RemoteViews(getPackageName(),
            R.layout.status_bar);
    RemoteViews bigViews = new RemoteViews(getPackageName(),
            R.layout.status_bar_expanded);

// showing default album image
    views.setViewVisibility(R.id.status_bar_icon, View.VISIBLE);
    views.setViewVisibility(R.id.status_bar_album_art, View.GONE);
    bigViews.setImageViewBitmap(R.id.status_bar_album_art,
            Constants.getDefaultAlbumArt(this));

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.setAction(Constants.ACTION.MAIN_ACTION);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            notificationIntent, 0);

    Intent previousIntent = new Intent(this, NotificationService.class);
    previousIntent.setAction(Constants.ACTION.PREV_ACTION);
    PendingIntent ppreviousIntent = PendingIntent.getService(this, 0,
            previousIntent, 0);

    Intent playIntent = new Intent(this, NotificationService.class);
    playIntent.setAction(Constants.ACTION.PLAY_ACTION);
    PendingIntent pplayIntent = PendingIntent.getService(this, 0,
            playIntent, 0);

    Intent nextIntent = new Intent(this, NotificationService.class);
    nextIntent.setAction(Constants.ACTION.NEXT_ACTION);
    PendingIntent pnextIntent = PendingIntent.getService(this, 0,
            nextIntent, 0);

    Intent closeIntent = new Intent(this, NotificationService.class);
    closeIntent.setAction(Constants.ACTION.STOPFOREGROUND_ACTION);
    PendingIntent pcloseIntent = PendingIntent.getService(this, 0,
            closeIntent, 0);

    views.setOnClickPendingIntent(R.id.status_bar_play, pplayIntent);
    bigViews.setOnClickPendingIntent(R.id.status_bar_play, pplayIntent);

    views.setOnClickPendingIntent(R.id.status_bar_next, pnextIntent);
    bigViews.setOnClickPendingIntent(R.id.status_bar_next, pnextIntent);

    views.setOnClickPendingIntent(R.id.status_bar_prev, ppreviousIntent);
    bigViews.setOnClickPendingIntent(R.id.status_bar_prev, ppreviousIntent);

    views.setOnClickPendingIntent(R.id.status_bar_collapse, pcloseIntent);
    bigViews.setOnClickPendingIntent(R.id.status_bar_collapse, pcloseIntent);

    views.setImageViewResource(R.id.status_bar_play,
            R.drawable.apollo_holo_dark_pause);
    bigViews.setImageViewResource(R.id.status_bar_play,
            R.drawable.apollo_holo_dark_pause);

    views.setTextViewText(R.id.status_bar_track_name, "Song Title");
    bigViews.setTextViewText(R.id.status_bar_track_name, "Song Title");

    views.setTextViewText(R.id.status_bar_artist_name, "Artist Name");
    bigViews.setTextViewText(R.id.status_bar_artist_name, "Artist Name");

    bigViews.setTextViewText(R.id.status_bar_album_name, "Album Name");

    status = new Notification.Builder(this).build();
    status.contentView = views;
    status.bigContentView = bigViews;
    status.flags = Notification.FLAG_ONGOING_EVENT;
    status.icon = R.mipmap.ic_launcher_custom;
    status.contentIntent = pendingIntent;
    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE, status);
}
}

But when i run the code and click on the play button the app crashes and logcat returns this error without pointing to a specific line of code.

android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid channel for service notification: Notification(channel=null pri=0 contentView=com.mani.eric.faithhyme/0x7f0b004c vibrate=null sound=null defaults=0x0 flags=0x42 color=0x00000000 vis=PRIVATE semFlags=0x0 semPriority=0 semMissedCount=0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1872)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:214)
android
notifications
android-mediaplayer
media-player
media
asked on Stack Overflow Jul 22, 2019 by Eric

1 Answer

0

You need to setup a notification channel for your notification. This is a google example of this:

// Create the channel object with the unique ID FOLLOWERS_CHANNEL.
val followersChannel = NotificationChannel(
       FOLLOWERS_CHANNEL,
       getString(R.string.notification_channel_followers),
       NotificationManager.IMPORTANCE_DEFAULT)

// Configure the channel's initial settings
followersChannel.lightColor = Color.GREEN
followersChannel.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 500, 200, 500)

// Submit the notification channel object to the notification manager
mNotificationManager.createNotificationChannel(followersChannel)

And then you need to setup and start your notification like this: (example)

NotificationManager notificationManager = 
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int notifyId = 1;
String channelId = "some_channel_id";

Notification notification = new Notification.Builder(MainActivity.this)
        .setContentTitle("Some Message")
        .setContentText("You've received new messages!")
        .setSmallIcon(R.drawable.ic_notification)
        .setChannel(channelId)
        .build();

notificationManager.notify(id, notification);
answered on Stack Overflow Jul 22, 2019 by Alex

User contributions licensed under CC BY-SA 3.0