音频的停止和播放按钮(Android)

时间:2010-04-22 17:39:53

标签: java android eclipse button media-player

我有这个问题,我想播放一些音频...

我有两个按钮,'播放'和'停止'......

问题是,在我按下停止按钮,然后按“播放”按钮后,没有任何反应。 - 停止按钮停止播放歌曲,但我希望播放按钮再次播放歌曲(从头开始)这是我的代码:

final MediaPlayer mp = MediaPlayer.create(this, R.raw.megadeth);

然后是两个公开的onclicks:

(播放...)

 button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Perform action on click
             button.setText("Playing!");
             try {
     mp.prepare();
    } catch (IllegalStateException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
             mp.start();
             //
            }
        });

停止赛道......

    final Button button2 = (Button) findViewById(R.id.cancel);
    button2.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

         mp.stop();
         mp.reset();

        }
    });

有人能看到这个问题吗?如果是这样,请你修理它......(建议)

非常感谢...

詹姆斯

3 个答案:

答案 0 :(得分:1)

您需要在prepare()之前致电preparAsync()start()

请参阅API for details(查看状态图)。

答案 1 :(得分:1)

Android文档中存在一个错误,在this页面中,您可以stop()一个“原始资源”媒体播放器,然后通过调用reset()重播它在再次致电prepare()之前start()。正如您所注意到的那样,这不起作用。

问题是reset()清除音频源并返回初始状态,因此您必须再次设置数据源。遗憾的是,您无法设置“原始资源”数据源,因为除create()之外没有其他API。

我不知道解决这个问题的干净方法。 stealthcopter的方式效果很好,但是对你的设计很痛苦,因为你需要每个start()调用的上下文:(并涉及破坏和创建一个复杂的对象,这对于像游戏这样的实时应用程序来说......

另一种确保create()调用只需要上下文的方法是以这种方式停止媒体播放器:

stop()
prepare()

但是如果你现在调用start(),它将不会从头开始重启。您可以拨打seekTo(0),但声音会从之前的播放位置产生一些噪音。

我一直在调查这个问题。在原始资源上创建时,必须有一种干净有效的方法来停止和重新启动媒体播放器......

答案 2 :(得分:0)

这是我在我的计划中工作的。它每次都会释放媒体播放器,因为每次调用时都会使用不同的声音,但是它应该可以作为您的使用方式。

创建:

    public MediaPlayer mp=null;

开始:

    if (mp!=null){ 
            mp.reset();
            mp.release();
    }
            mp = MediaPlayer.create(test.this, soundResource);
            mp.start();

停止:

        mp.stop();

另请注意,您不需要使用prepare,因为create方法已经为您调用(API REF)。