【问题标题】:How to get music to stop on next button click如何让音乐在下一个按钮单击时停止
【发布时间】:2016-08-03 01:55:17
【问题描述】:

我有一些代码可以启动文本到语音并在按下按钮时开始播放声音。除了一个细节外,一切都很好。当连续按下两个按钮时,声音开始重叠。有没有办法在每次按下按钮时切断媒体播放器?我使用了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;

}

【问题讨论】:

  • "但没有任何效果" 为什么?

标签: java android android-mediaplayer


【解决方案1】:

onClick(...) 方法之外定义和初始化MediaPlayer 实例,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 实例,而不是在上一次按下按钮时创建和启动的实例。

【讨论】:

    【解决方案2】:

    我没有评论的声誉,所以用这个代替。

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

    解决方案是将对象移到范围的更高位置,或者在包含对象中具有引用,或者将MediaPlayers 存储在集合中。然后,在 onClick 方法的开始处,停止旧的,然后再创建新的并覆盖引用。

    除非对 Android 有一些警告,否则应该可以。

    【讨论】:

      猜你喜欢
      • 2023-01-22
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2014-09-12
      • 2014-03-05
      • 2022-08-13
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多