Search code examples
androidandroid-mediaplayerandroid-imagebutton

MediaPlayer plays wrong file on first click


Can someone point out where I am going wrong with this? When I press the image button it always plays pinktestaudio first even if I did not press the corresponding button. I have to press the image button twice to hear the correct sound.This occurs when the page is first loaded, after the first time it seems fine but still something that shouldn't happen.

import android.content.Context;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;



public class ColorPage extends AppCompatActivity {

Context context = this;
//MediaPlayer mpPurple, mpBlue, mpRed, mpGreen, mpYellow, mpPink;
MediaPlayer media = null;
//private static MediaPlayer media = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_color_page);

    ImageButton pinkB = (ImageButton) findViewById(R.id.pinkButton);
    ImageButton yellowB = (ImageButton) findViewById(R.id.yellowButton);
    ImageButton purpleB = (ImageButton) findViewById(R.id.purpleButton);
    ImageButton blueB = (ImageButton) findViewById(R.id.blueButton);
    ImageButton greenB = (ImageButton) findViewById(R.id.greenButton);
    ImageButton redB = (ImageButton) findViewById(R.id.redButton);


    media = MediaPlayer.create(context, R.raw.purpleaudiotest);
    purpleB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                if (media.isPlaying()) {
                    media.stop();
                    media.release();
                    media = MediaPlayer.create(context, R.raw.purpleaudiotest);
                }
                media.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    media = MediaPlayer.create(context, R.raw.blueaudiotest);
    blueB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                if (media.isPlaying()) {
                    media.stop();
                    media.release();
                    media = MediaPlayer.create(context, R.raw.blueaudiotest);
                }
                media.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    media = MediaPlayer.create(context, R.raw.redaudiotest);
    redB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                if (media.isPlaying()) {
                    media.stop();
                    media.release();
                    media = MediaPlayer.create(context, R.raw.redaudiotest);
                }
                media.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    media = MediaPlayer.create(context, R.raw.greenaudiotest);
    greenB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                if (media.isPlaying()) {
                    media.stop();
                    media.release();
                    media = MediaPlayer.create(context, R.raw.greenaudiotest);
                }
                media.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    media = MediaPlayer.create(context, R.raw.yellowaudiotest);
    yellowB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                if (media.isPlaying()) {
                    media.stop();
                    media.release();
                    media = MediaPlayer.create(context, R.raw.yellowaudiotest);
                }
                media.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    media = MediaPlayer.create(context, R.raw.pinkaudiotest);
    pinkB.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            try {
                if (media.isPlaying()) {
                    media.stop();
                    media.release();
                    media = MediaPlayer.create(context, R.raw.pinkaudiotest);
                }
                media.start();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
}
}

Updated: changing the start of the if statement(all of them) to as follows fixed the issue.

    if (media != null) {
                    media.stop();
                    media.release();
                    media = MediaPlayer.create(context, R.raw.pinkaudiotest);
                }

Solution

  • It always plays pinktestaudio because you have done

    media = MediaPlayer.create(context, R.raw.pinkaudiotest); at the end, so media will always be initialized with pinktestaudio. even after you click a different button because in every buttons OnClickListener you do

    if(media.isPlaying()) {
            media.stop();
            media.release();
            media = MediaPlayer.create(context, R.raw.pinkaudiotest);
    }
    

    on clicking any button for first time media.isPlaying() will always be false so

    media = MediaPlayer.create(context, R.raw.some_audio_file);

    will not be executed. But when you click again media.isPlaying() is true and all goes well.