【问题标题】:Play and stop music when press and release a button按下和释放按钮时播放和停止音乐
【发布时间】:2013-12-07 21:43:10
【问题描述】:

我正在编写一个带有按钮的音乐应用程序。我想在按下按钮时发出音乐声,但在释放按钮时停止。此外,我想在循环时间之间不分离的情况下以恒定循环播放音乐。 现在,当我按下按钮时,音乐开始播放,但当我松开按钮时,它仍在播放,直到文件结束。

这是代码:

    @Override
        public boolean onTouch(View v, MotionEvent event) {
            MediaPlayer do2n = MediaPlayer.create(this, R.raw.do_leg);
            if(event.getAction() == MotionEvent.ACTION_DOWN) {
                if(v.getId()==R.id.dor){
                   do2n.start();
                }
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                if(v.getId()==R.id.dor){
                    if (do2n != null)
                        do2n.release();
                }
            }
        return true;
}

【问题讨论】:

  • 尝试在代码的 Action_UP 块中添加 do2n.stop() 看看是否有帮助
  • @kabuto178 不起作用,MediaPlayer 是在方法中创建的。它需要在方法之外创建,以便ACTION 事件可以启动和停止同一个MediaPlayer 实例,正如@gunar 所讨论的那样。
  • 是的,我现在注意到 Dan,没想到他真的在那里声明了媒体播放器。

标签: java android android-mediaplayer


【解决方案1】:

好吧,自从onTouch 被调用两次以来,您实际上已经创建了 2 个 MediaPlayer 实例:一次用于按键按下,一次用于按键向上。因此,第一次创建播放器时,您会丢失参考。第二次调用onTouch,对于ACTION_UP,您正在创建一个新的MediaPlayer 对象,但该对象与之前使用ACTION_DOWN 创建的对象不同,因此在这个新创建的对象上调用stop 具有没有效果。

因此您可以将播放器实例化为类变量。如下所示:

private MediaPlayer do2n;

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (v.getId() == R.id.dor) {
            do2n = MediaPlayer.create(this, R.raw.do_leg);
            do2n.start();
        }
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        if (v.getId() == R.id.dor) {
            if (do2n != null) {
                do2n.stop();
                do2n.release();
                do2n = null;
            }
        }
    }
    return true;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    /**
     * The activity may be destroyed if you receive a long phone call while
     * keeping the button pressed so it's safe to do this
     */
    if (do2n != null) {
        do2n.stop();
        do2n.release();
    }
}

【讨论】:

  • 我在 onCreate 之前初始化了变量,并添加了 do2n = MediaPlayer.create(this, R.raw.do_leg);在 onCreate 里面。
  • 现在不行了。现在连音乐都听不见了。这行不通。请帮帮我
  • ...你需要从onTouch中删除MediaPlayer do2n = MediaPlayer.create(this, R.raw.do_leg);
  • Logcat 会报告什么吗?
  • 12-05 22:48:13.090 3985-3985/com.gatgdev.rhenium E/AndroidRuntime: 致命异常:android.media.MediaPlayer._stop 的主要 java.lang.IllegalStateException(本机方法)在 android.media.MediaPlayer.stop(MediaPlayer.java:1062) 在 com.gatgdev.rhenium.MainActivity.onTouch(MainActivity.java:104)
猜你喜欢
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多