我有一个ListView,当我点击一行时,我会发出声音。
如果正在播放声音,我点击另一行,第一行应停止,第二行开始。
如果我没有释放MediaPlayer,应用程序崩溃,但这会延迟下一个声音的执行。
我做错了什么?这是我的代码:
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
if(!isPlaying){
mPlayer = MediaPlayer.create(this,soundid[position]);
mPlayer.start();
isPlaying = true; // reproducir es true
}else{
isPlaying = false;
mPlayer.stop();
mPlayer.reset();
mPlayer = MediaPlayer.create(this,soundid[position]);
mPlayer.start();
isPlaying = true;
}
mPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mPlayer) {
mPlayer.release();
isPlaying = false;
}
});
}
答案 0 :(得分:3)
在这种类型的实现中,您正在创建多个媒体播放器实例,而不释放它们会导致异常(refer here)。我建议你重新使用现有的媒体播放器实例。你可以通过做这样的事情来实现你的目标。
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
if(!isPlaying){
mPlayer = new MediaPlayer();
mPlayer.setDataSource(soundid[position]);
mPlayer.prepare();
mPlayer.start();
isPlaying = true;
}else{
isPlaying = false;
mPlayer.stop();
mPlayer.reset();
mPlayer.setDataSource(soundid[position]);
mPlayer.prepare();
mPlayer.start();
isPlaying = true;
}
mPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mPlayer) {
mPlayer.release();
isPlaying = false;
}
});
}
答案 1 :(得分:1)
为什么要再次创建MediaPlayer?
您可以使用'setDataSource'
设置文件。
见这里:android developer website: MediaPlayer
答案 2 :(得分:1)
如果您在比赛结束时不需要采取行动;您可以考虑使用SoundPool:http://developer.android.com/reference/android/media/SoundPool.html
答案 3 :(得分:0)
更清洁的实施方式,
public class PlayMedia{
private MediaPlayer mMediaPlayer = new MediaPlayer();
Context context;
boolean isPlaying;
PlayMedia(Context c){
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
isPlaying = false;
}
});
this.context = c;
}
public boolean stopResetAndPlay(int ResID){
if(isPlaying){
isPlaying = false;
mMediaPlayer.stop();
mMediaPlayer.reset();
try {
AssetFileDescriptor afd = context.getResources().openRawResourceFd(ResID);
if (afd == null) return false;
mMediaPlayer.setDataSource(afd);
afd.close();
mMediaPlayer.prepare();
}catch(IOException io){
Log.i("Playing ", io.getMessage());
return false;
}
mMediaPlayer.start();
isPlaying = true;
}else{
try {
this.mMediaPlayer = new MediaPlayer();
AssetFileDescriptor afd = context.getResources().openRawResourceFd(ResID);
if (afd == null) return false;
mMediaPlayer.setDataSource(afd);
mMediaPlayer.prepare();
mMediaPlayer.start();
isPlaying = true;
}catch(IOException io){
Log.i("Playing ", io.getMessage());
return false;
}
}
return true;
}}
这是您可以在任何活动中使用该类的方式
PlayMedia mPlayer = new PlayMedia(context);
int resID = context.getResources().getIdentifier("identifer_string", "raw", context.getPackageName());
mPlayer.stopResetAndPlay(resID);