我在我的应用中有一个列表视图。每个列表视图项都有一个按钮,该按钮将从从Web服务接收的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();
}
}
});
答案 0 :(得分:2)
将mp
变量设为全局并删除它:
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
因为如果你看一下这个引用http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram,它会说:
一旦MediaPlayer对象处于End状态,它就不再是 使用过,没有办法把它带回任何其他州。
当你致电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();
}
});
诀窍是让它回到空闲状态,这样你就可以设置新的数据源并重新开始播放。这完全是关于各州......