Search code examples
javaandroid-mediaplayerseekbar

How can I make the button pause remember where the MediaPlayer stopped?


I made a MediaPlayer some time ago and I faced a big issue. The audio can't be played in the background so I must use Service. At this point, I managed to play the music and to stop it, but when I click play again, it restarts and I don't know what to do. I am new to coding. Other than that I want to make a working seekbar and a textView for player position, but that for another time. If there is someone to help me I would really appreciate it.

Here is the code I am using now:

btPause = findViewById(R.id.btPauseMusic);
btPlay = findViewById(R.id.btPlayMusic);

btPlay.setOnClickListener(v -> {

    startService(new Intent(this, BackgroundMusicService.class));

    btPlay.setVisibility(View.GONE);

    btPause.setVisibility(View.VISIBLE);
});

btPause.setOnClickListener(v -> {

    stopService(new Intent(this, BackgroundMusicService.class));

    btPause.setVisibility(View.GONE);

    btPlay.setVisibility(View.VISIBLE);
});

}

The service:

public class BackgroundMusicService extends Service {

private MediaPlayer mediaPlayer;

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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer = MediaPlayer.create(this, R.raw.ding_dong);
mediaPlayer.start();
    return START_STICKY;
}

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

mediaPlayer.stop();
}
}

Solution

  • Add this notification code in your BackgroundMusicService inside on onCreate.

    Intent stopSelf = new Intent(this, BackgroundMusicService.class);
            stopSelf.setAction("Stop");
            PendingIntent pStopSelf = PendingIntent
                    .getService(this, 0, stopSelf
                            , PendingIntent.FLAG_CANCEL_CURRENT);
            Notification notification;
            NotificationCompat.Action action =
                    new NotificationCompat.Action.Builder(
                            0, "Pause", pStopSelf
                    ).build();
    Intent startSelf = new Intent(this, BackgroundMusicService.class);
        stopSelf.setAction("Start");
        PendingIntent pstartSelf = PendingIntent
                .getService(this, 0, stopSelf
                        , PendingIntent.FLAG_CANCEL_CURRENT);
        Notification notifications;
        NotificationCompat.Action actions =
                new NotificationCompat.Action.Builder(
                        0, "Play", pstartSelf
                ).build();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel serviceChannel = new NotificationChannel("channal", "Notification", NotificationManager.IMPORTANCE_HIGH);
                NotificationManager notificationManager = getSystemService(NotificationManager.class);
                notificationManager.createNotificationChannel(serviceChannel);
                notification = new NotificationCompat.Builder(this, "channal")
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentText("Music.")
                        .setPriority(Notification.PRIORITY_MAX)
                        .addAction(action)
                        .addAction(actions).build();
            } else {
                notification = new NotificationCompat.Builder(this, "channal")
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setContentTitle("App name")
                        .setContentText("Music.")
                        .setPriority(Notification.PRIORITY_MAX)
                        .addAction(action)
                         .addAction(actions)
                        .build();
            }
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
            notificationManager.notify(1, notification);
            startForeground(1, notification);
    

    In onStartCommand your intent actions are called where you can pause and play the music by using the length.

     int length=0;
    @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            super.onStartCommand(intent, flags, startId);
            if ("STOP".equals(intent.getAction())) {
              //inside here pause  the music.
                mediaPlayer.pause();
                length = mediaPlayer.getCurrentPosition();
            }else if ("Start".equals(intent.getAction())) {
          //inside here play the music with seekto by length where the music was.
                 mediaPlayer.start();
                 mediaPlayer.seekTo(length);
           
            }
           
            return START_STICKY;
        }
    

    Note: If you still did not understand anything you can ask me in the comment.