我有这个问题,我想播放一些音频...
我有两个按钮,'播放'和'停止'......
问题是,在我按下停止按钮,然后按“播放”按钮后,没有任何反应。 - 停止按钮停止播放歌曲,但我希望播放按钮再次播放歌曲(从头开始)这是我的代码:
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();
}
});
有人能看到这个问题吗?如果是这样,请你修理它......(建议)
非常感谢...
詹姆斯
答案 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)。