你一直在研究我的应用程序,并且发现了一项似乎无法克服的活动的障碍。活动本质上是一个大型的新奇钢琴,有8个按键播放声音,侧面有6个按钮,可以改变音符和音符本身的图像,这个我完成了:-)现在我想为每个添加一个背景歌曲不同的笔记(乐器)只有当我做应用程序崩溃我已经使用MediaPlayer mp将媒体播放器设置在顶部(全局?); MediaPlayer mp2;等我在我的代码中使用它来检查是否正在播放音乐,停止播放,释放它,然后播放我想要的片段,
if(mp!=null&&mp.isPlaying()){
mp.stop();
mp.release();
}
if(mp2!=null&&mp2.isPlaying()){
mp2.stop();
mp2.release();
}
if(mp3!=null&&mp3.isPlaying()){
mp3.stop();
mp3.release();
}
mp3 = MediaPlayer.create(MusicActivity.this, R.raw.snaps);
mp3.setLooping(true);
mp3.start();
这又有效,但是从一个到另一个,然后又崩溃了应用程序。还有别的我应该做的吗?或只是一个内存不足的错误?
EDIT-- 感谢ranjk89的帮助
更改为soundpool但他们不会停止ranjk89建议引用流ID而不是声音id寻找更多澄清,如果可能我有
farmback =0;
drumback =0;
在顶部然后使用
加载oncreatedrumback = sp.load(this, R.raw.snaps,1);
farmback = sp.load(this, R.raw.oldmacdonaldbeta,1);
然后向下,用同样的方法我改变按钮图标,不一样的方法我改变我所有的其他声音为我的笔记打电话
sp.stop(drumback);
sp.play(farmback, 1, 1, 0, -1, 1);
在一个和
sp.stop(farmback);
sp.play(drumback, 1, 1, 0, -1, 1);
在另一个,但总共有6种不同的乐器,所有都需要不同的背景音轨,当乐器改变时应该停止并播放与之相关的乐器,如
if (sp !=null && sp.isplaying()){
sp.stop();
sp.play(dumback);
}
但显然这是不可能的任何帮助赞赏
答案 0 :(得分:0)
我最初的反应是,你不应该首先使用多个MediaPlayer。
我建议您使用SoundPool,因为您最初可以加载所有媒体(音频),一旦它们全部加载,您可以随意播放它们。此外,您还没有多个玩家可以缩小代码的复杂程度。
但如果您确实想使用媒体播放器,
见this。但请注意,一旦release,您将无法重用该MediaPlayer实例。即使您使用多个MediaPlayers,也不要在它们上面发布,除非您确定不再想要使用它们。使用stop()/ prepare()组合。
对于在主线程上做太多工作的应用程序,
如果您使用SoundPool或仅使用一个MediaPlayer并仍然遇到同样的问题,请使用AsyncTask。 Android开发者网站在此
上有一个非常好的tutorial