我有一个音板应用,可以在按下按钮时调用音频文件。但是,在按下并播放大部分按钮后,我开始收到这些媒体播放器错误。有谁知道如何检测它,只是重新启动或完全停止它?谢谢你的时间。
-colby
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
ImageButton button = (ImageButton) findViewById(entry.getKey());
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
int sound = map.get(v.getId());
mp = MediaPlayer.create(myMain.this, sound);
mp.prepare();
} catch (IllegalStateException e) {
} catch (IOException e) {
}
mp.seekTo(0);
mp.start();
}
}
);
}
04-13 10:11:39.873:INFO / MediaPlayer(23152):MediaPlayer start()
04-13 10:11:39.873:VERBOSE / MediaPlayerService(18229):[666] setLooping(0)
04-13 10:11:39.873:VERBOSE / MediaPlayerService(18229):[666] setVolume(1.000000,1.000000)
04-13 10:11:39.873:VERBOSE / AudioSink(18229):setVolume(1.000000,1.000000)
04-13 10:11:39.873:VERBOSE / MediaPlayerService(18229):[666]开始
04-13 10:11:39.873:DEBUG / AwesomePlayer(18229):[U5B] play(556)
04-13 10:11:39.873:DEBUG / AwesomePlayer(18229):[U5B] play_l(562)
04-13 10:11:39.873:VERBOSE / AudioSink(18229):open(44100,1,1,4)
04-13 10:11:39.873:ERROR / AudioFlinger(18229):没有更多的赛道名称
04-13 10:11:39.873:ERROR / AudioTrack(18229):AudioFlinger无法创建曲目,状态:12
04-13 10:11:39.873:ERROR / AudioSink(18229):无法创建音轨
04-13 10:11:39.873:ERROR / MediaPlayer(23152):错误(-19,0)
04-13 10:11:39.894:INFO / MediaPlayer(23152):MediaPlayer handleMessage what = 5
04-13 10:11:39.894:INFO / MediaPlayer(23152):MediaPlayer handleMessage what = 1
04-13 10:11:39.894:INFO / MediaPlayer(23152):MediaPlayer handleMessage what = 4
04-13 10:11:42.114:INFO / MediaPlayer(23152):MediaPlayer create()
04-13 10:11:42.114:INFO / MediaPlayer(23152):MediaPlayer
04-13 10:11:42.114:VERBOSE / MediaPlayerService(18229):客户端(667)构造函数
答案 0 :(得分:5)
詹姆斯有正确的想法。您在一段时间后创建了太多的MediaPlayer实例,并且内存不足。我之前发布的解决方案是这样的:
public MediaPlayer mp;
public Resources res = getResources();
View.OnClickListener listener = new View.OnClickListener() {
public void onClick(View v) {
try {
int sound = map.get(v.getId());
AssetFileDescriptor afd = res.openRawResourceFd(sound);
mp.reset();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
ImageButton button = (ImageButton)findViewById(entry.getKey());
button.setOnClickListener(listener);
}
这可能无法编译(我假设您的声音ID来自res / raw文件夹),但想法是,只有一个MediaPlayer实例,并且每当单击一个按钮时,重置该实例,设置数据源到相应的FileDescriptor,准备它,然后开始播放。
答案 1 :(得分:2)
我不太确定,但我认为您只想为每个声音创建一次媒体播放器,然后调用start,seekTo,然后停止播放。