如何在下一次按钮点击时停止播放音乐

时间:2016-08-02 17:18:02

标签: java android android-mediaplayer

我有一些代码可以启动文本到语音,并在按下按钮时开始播放声音。除了一个细节,一切都很好。连续按下两个按钮时,声音开始重叠。每次按下按钮,有没有办法切断媒体播放器?我使用了noise1.pause(),noise1.stop()和noise1.reset(),但没有任何效果。我正在考虑使用mediaplayer完整的监听器,但我不确定如何实现这一点。任何帮助,将不胜感激。非常感谢!!!

public void onClick(View view) {

    Resources res = getResources();
    final TextView tv = (TextView) findViewById(R.id.color_text);

    final MediaPlayer noise1 = MediaPlayer.create(this, R.raw.one);
    final MediaPlayer noise2 = MediaPlayer.create(this, R.raw.two);
    final MediaPlayer noise3 = MediaPlayer.create(this, R.raw.three);

    switch (view.getId()) {
        case R.id.one_button:

            String oneString = res.getString(R.string.One);
            tv.setText(oneString);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
                tts.speak(oneString, TextToSpeech.QUEUE_FLUSH, null);
            } else {
                tts.speak(oneString, TextToSpeech.QUEUE_FLUSH, null, null);
            }

            noise1.start();

            break;

        case R.id.two_button:

            String twoString = res.getString(R.string.Two);
            tv.setText(twoString);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
                tts.speak(twoString, TextToSpeech.QUEUE_FLUSH, null);
            } else {
                tts.speak(twoString, TextToSpeech.QUEUE_FLUSH, null, null);
            }

            noise2.start();

            break;

        case R.id.three_button:

            String threeString = res.getString(R.string.Three);
            tv.setText(threeString);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
                tts.speak(threeString, TextToSpeech.QUEUE_FLUSH, null);
            } else {
                tts.speak(threeString, TextToSpeech.QUEUE_FLUSH, null, null);
            }

            three.start();

            break;

}

2 个答案:

答案 0 :(得分:0)

定义并初始化MediaPlayer方法之外的onClick(...)个实例,stop()方法应该有效。

这就是我的意思:

MediaPlayer noise1, noise2, noise3;
TextView tv;

public void onCreate(....){
    .....
    tv = (TextView) findViewById(R.id.color_text);

    noise1 = MediaPlayer.create(this, R.raw.one);
    noise2 = MediaPlayer.create(this, R.raw.two);
    noise3 = MediaPlayer.create(this, R.raw.three);
    ....
}

public void onClick(View view) {
    switch (view.getId()) {
        case R.id.one_button:
            ...
            noise1.start();
            noise2.stop();
            noise3.stop();
        break;

        case R.id.two_button:
            ...
            noise1.stop();
            noise2.start();
            noise3.stop();
        break;

    case R.id.three_button:
            ...
            noise1.stop();
            noise2.stop();
            noise3.start();
        break;
}

它现在无法正常工作,因为您正在尝试停止您刚刚创建的MediaPlayer实例,而不是在上次按下按钮时创建并启动的实例。< / p>

答案 1 :(得分:0)

我没有评论的声誉,所以请改为。

创建的MediaPlayer对象在方法的范围内,这意味着只要onClick返回,对象就没有引用,因此无法停止。

解决方案是将范围内的对象移动到更高的位置,或者在包含对象中引用,或者将MediaPlayer存储在集合中。然后,在onClick方法的开头,在创建新的方法并覆盖引用之前停止旧方法。

除非对Android有一些警告,否则这应该有用。