我的应用程序中有一个 ListView 。每个 ListView 项目都有一个按钮,该按钮将从网络服务收到的 url 播放音频。但我的问题是,如果我点击下一个项目的播放按钮,那么两者就会开始一起播放。我在这方面有问题。我只想一次玩一个。现在,每次单击按钮时我都在创建新的媒体播放器对象,但我也尝试创建一个全局对象,但在这种情况下它只播放第一次而不是之后播放。它的可能解决方案是什么。
finalHolder.iv_sound.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(birdsUrlList.get(position).getUrl_audio());
mp.prepare();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
//startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(birdsUrlList.get(position).getUrl_video())));
} catch (Exception e) {
e.printStackTrace();
}
}
});
最佳答案
使 mp
变量成为全局变量并删除它:
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
因为如果你看一下这个引用 http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram它说:
Once the MediaPlayer object is in the End state, it can no longer be used and there is no way to bring it back to any other state.
当您调用 mp.release();
时,媒体播放器将进入该状态。
然后让你的 onClickListener 看起来像这样:
@Override
public void onClick(View v) {
try {
if (mp.isPlaying()) {
mp.stop();
mp.reset();
}
mp.setDataSource(birdsUrlList.get(position).getUrl_audio());
//... and so on
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.stop();
mp.reset();
}
});
这里的技巧是让它回到空闲状态,这样您就可以设置新的数据源并重新开始播放。一切都与各州有关...
关于android - 在播放下一个音频之前停止媒体播放器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35539363/