MediaPlayer在第一次单击时播放错误的文件

时间:2017-10-10 15:54:39

标签: android android-mediaplayer android-imagebutton

有人可以指出我出错的地方吗?当我按下图像按钮时,即使我没有按下相应的按钮,它也会首先播放pinktestaudio。我必须按两次图像按钮才能听到正确的声音。这是在第一次加载页面时发生的,第一次看起来很好但仍然不应该发生。

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();
            }

        }
    });
}
}

更新:将if语句的开头(所有这些)更改为如下修复了问题。

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

3 个答案:

答案 0 :(得分:0)

在onCreate 6中创建MediaPlayer实例。最后一个用于每个听众。

重构后看看你的代码:

public class ColorPage extends AppCompatActivity implements View.OnClickListener {

MediaPlayer mMediaPlayer = 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);

    pinkB.setOnClickListener(this);
    yellowB.setOnClickListener(this);
    purpleB.setOnClickListener(this);
    blueB.setOnClickListener(this);
    greenB.setOnClickListener(this);
    redB.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    int audio;

    switch (view.getId()) {
        case R.id.pinkButton:
            audio = R.raw.pinkaudiotest;
            break;
        case R.id.yellowButton:
            audio = R.raw.yellowaudiotest;
            break;
        case R.id.purpleButton:
            audio = R.raw.purpleaudiotest;
            break;
        case R.id.blueButton:
            audio = R.raw.blueaudiotest;
            break;
        case R.id.greenButton:
            audio = R.raw.greenaudiotest;
            break;
        case R.id.redButton:
            audio = R.raw.redaudiotest;
            break;
        default:
            audio = R.raw.purpleaudiotest;
    }

    try {
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
        }

        mMediaPlayer = MediaPlayer.create(getApplicationContext(), audio);
        mMediaPlayer.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
祝你好运!

答案 1 :(得分:0)

它总是播放pinktestaudio,因为你已经完成了

media = MediaPlayer.create(context, R.raw.pinkaudiotest); 最后,media将始终使用pinktestaudio进行初始化。 即使您点击其他按钮,因为在每个按钮OnClickListener中都可以

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

第一次点击任何按钮时media.isPlaying()将始终为false

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

不会被执行。 但是当你再次点击时media.isPlaying()为真,一切顺利。

答案 2 :(得分:0)

这是因为您已多次分配media变量,并为pinkaudiotest分配了最后一次变量,因此要解决您的问题,您必须在内部分配变量media事件。因此,只有在单击按钮时才会分配它。 `。 以下是您应该使用自己的相同代码执行的操作:

你有 SIX 这些看起来相似的行

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

剪切这些线并将其粘贴到相应图像按钮的onClick方法中。我将为你做第一个并重复所有 SIX 次。

    purpleB.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      // I AM ADDING IT HERE
     media = MediaPlayer.create(context, R.raw.purpleaudiotest); //ADDED INSIDE oClick(View view)

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

对所有 SIX ImageButton重复此操作,问题就会消失。