在播放下一个音频之前停止媒体播放器

时间:2016-02-21 17:25:30

标签: android audio android-mediaplayer

我在我的应用中有一个列表视图。每个列表视图项都有一个按钮,该按钮将从从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();
                        }
                    }
                });

1 个答案:

答案 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();
            }
        });

诀窍是让它回到空闲状态,这样你就可以设置新的数据源并重新开始播放。这完全是关于各州......