我有一个关于android MediaPlayer的有趣的情况。我有大约30个声音,我需要在活动中播放。我得到了奇怪的结果,我不确定是不是因为内存问题……
我需要使用媒体播放器的原因是,我有一个声音的定时流,其中一个声音需要按照特定的顺序播放另一个声音。我还使用回调来查看接下来播放哪个声音。因此,soundpool是不存在的。
我尝试使用MediaPlayer.create()将每个声音加载到它自己的媒体播放器中。现在,这在我的三星Galaxy S充满活力的设备上运行得很好。然而,当我尝试设置onCompletionListener时,我的客户端使用三星Ace时收到空指针异常,这意味着.create()在他的设备上返回空,但我的设备没有返回空。
因此,我从一次加载它们全部切换到在以前的声音using this method的onCompletionListener中动态加载它们
这种工作,拳头3-4的声音播放,然后它挂在我的客户的设备(仍然可以很好地在我的设备上)。我假设它挂在.prepare()上
这很难解决,因为我的客户没有真正的logcat知识,也没有SDK需要调试,而且它在我的设备上运行得很好。它甚至挂在他的第二个设备上,这是与我的相同的型号。
有谁知道这可能是什么原因,或者如何调试它?
我想我的下一步将是简单地使用一个MediaPlayer,并使用OnCompletionListener的mp参数在同一个媒体播放器上加载下一个声音。我会发布我的发现。
发布于 2011-11-28 12:14:36
所以,这一定是某种记忆问题。我一开始加载了20+媒体播放器。
现在,我将它们整合到一个媒体播放器中,并动态加载声音。声音很小,所以我不担心加载时间。
这里有一些帮助程序代码,以防有人需要它。
private MediaPlayer getMediaPlayer(MediaPlayer mp, int resID, OnCompletionListener listener){
mp.release();
mp = null;
mp = new MediaPlayer();
AssetFileDescriptor afd = getResources().openRawResourceFd(resID);
try {
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mp.prepare();
mp.setOnCompletionListener(listener);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return mp;
}我用它来加载一个新的声音。它有相当多的开销,但它是有效的,这才是最重要的。
下面是我如何使用它。
mSoundPlayer = getMediaPlayer(mSoundPlayer, R.raw.a123switch, endSwitch123Listener);
mSoundPlayer.start();发布于 2011-11-27 08:06:13
如果您正确释放了媒体播放器,应该不会出现内存问题。您可以通过执行以下操作来适当地确保这一点:
if(mediaplayer!=null){
if(mediaplayer.isPlaying()){
mediaplayer.stop();
}
mediaplayer.release();
mediaplayer = null;
}我相信有一个10MB的限制(最低,有些手机更高)的apk内存分配,所以你应该能够检查这符合你的限制。然而,市场将允许最多50MB。
对于调试,我建议您确保所有的assests都在那里(听起来很傻,但它排除了这一点),因为如果您缺少声音文件,它肯定无法创建。在抛出异常的情况下创建Toast通知,例如IllegalStateException将确保您对媒体播放器状态的管理不是问题。
值得一提的是,您不应该将prepare和create混为一谈。如果你使用的是create,它已经调用了prepare,随后对prepare的调用可能会导致奇怪的行为;但不确定它是否会使播放器无效!
一般来说,你并不想真的按照你建议的方式去做(创建一个新的媒体播放器并在onComplete中改变声音)。原因很简单,当你调用create或prepare时,它会将声音加载到内存中-这将花费不同的时间,这取决于手机(对于某些手机来说,这可能是一个很长的时间!)。一次加载它们要好得多。
https://stackoverflow.com/questions/8282529
复制相似问题