我有一个声卡应用程序,可以在按下按钮时调用音频文件。然而,在大多数按钮被按下并播放之后,我开始发现这些mediaplayer错误。有人知道如何检测它,然后重新启动或完全停止它的发生吗?谢谢你的时间。
科尔比
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:信息/媒体播放器(23152):媒体播放器开始()
04-13 10:11:39.873:详细/MediaPlayerService(18229):[666]设置循环(0)
04-13 10:11:39.873:详细/MediaPlayerService(18229):[666]设置卷(1.000000,1.000000)
04-13 10:11:39.873:详细/音频接收器(18229):设置音量(1.000000,1.000000)
04-13 10:11:39.873:详细/MediaPlayerService(18229):[666]开始
04-13 10:11:39.873:debug/awesomeplayer(18229):[u5b]播放(556)
04-13 10:11:39.873:debug/awesomeplayer(18229):[u5b]播放(562)
04-13 10:11:39.873:详细/音频接收器(18229):打开(44100,1,1,4)
04-13 10:11:39.873:error/audioflinger(18229):没有可用的曲目名称
04-13 10:11:39.873:错误/AudioTrack(18229):AudioFlinger无法创建磁道,状态:12
04-13 10:11:39.873:错误/音频接收器(18229):无法创建音频曲目
04-13 10:11:39.873:错误/媒体播放器(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:信息/媒体播放器(23152):媒体播放器创建()
04-13 10:11:42.114:信息/媒体播放器(23152):媒体播放器
04-13 10:11:42.114:详细/MediaPlayerService(18229):客户端(667)构造函数
最佳答案
詹姆斯有正确的想法。一段时间后创建的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实例,每当单击按钮时,重置该实例,将数据源设置为相应的文件描述符,准备它,然后开始播放。