Search code examples
androidandroid-studioandroid-mediaplayermedia-player

Mediaplayer - stop current audio when clicking on new audio


Im a newbie to android studio (programming at general) but i want to build a mediaplayer for learning purposes.

I have a a list of local music in a listView that contains 2 images 'play, pause and stop button'.

This is how my app works:

  • Click on playbutton -> start music
  • Click on pausebutton -> pause music
  • Click on stopbutton -> stop music

Very simple. BUT! the thing is -> when i pause a song and want to play another song in my list then it just resume the first song i clicked on.

I want it to release the first song and start the other one i click on.

This is my code:

// play music
    viewHolder.playB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (flag) {
                //get song you clicked on
                mediaPlayer = MediaPlayer.create(context, song.getSong());

                //set boolean to false so it can get ANOTHER song when 
                //clicked
                flag = false;
                Toast.makeText(context, "Playing" + song.getName(), 
                Toast.LENGTH_LONG).show();
            }
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                viewHolder.playB.setImageResource(R.drawable.play);
            } else {
                mediaPlayer.start();
                viewHolder.playB.setImageResource(R.drawable.pause);
            }
        }
    });

    // stop
    viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!flag) {
                mediaPlayer.stop();
                mediaPlayer.release();
                flag = true;
            }
            viewHolder.playB.setImageResource(R.drawable.play);
        }
    });

Solution

  • Your logic is a little bit wrong. When you create the MediaPlayer you set flag to false and as long as you do not stop playback flag doesn't change. But your MediaPlayer creation depends on it.

    For future improvements (maybe when you're more confident in working with MediaPlayer and Android) you should take a look at a more "self-made" approach instead of MediaPlayer.create(...) cause this method is calling MediaPlayer's prepare() method that is going to eventually make your app extremely slow or crash it when loading big files.

    Example according to comments
    I assumed songis going to be the class object.

    // class variable will hold the currently loaded song
    private Song mCurrentSong;
    
    [...]
    
    viewHolder.playB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    
            // MediaPlayer has not been initialized OR clicked song is not the currently loaded song
            if (mCurrentSong == null || song != mCurrentSong) {
    
                // Sets the currently loaded song
                mCurrentSong = song;
                mediaPlayer = MediaPlayer.create(context, song.getSong());
    
                Toast.makeText(context, "Playing" + song.getName(), 
                Toast.LENGTH_LONG).show();
            }
    
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                viewHolder.playB.setImageResource(R.drawable.play);
            } else {
                mediaPlayer.start();
                viewHolder.playB.setImageResource(R.drawable.pause);
            }
        }
    });
    
    viewHolder.stopB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
    
            // If currently loaded song is set the MediaPlayer must be initialized
            if (mCurrentSong != null) {
                mediaPlayer.stop();
                mediaPlayer.release();
                mCurrentSong = null; // Set back currently loaded song
            }
            viewHolder.playB.setImageResource(R.drawable.play);
        }
    });