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

标签 android audio android-mediaplayer

我的应用程序中有一个 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/

相关文章:

java - 使用 Firestore 数据库在 map 上创建多个标记

objective-c - 核心动画+核心音频+ sleep 未按预期顺序进行

php - 通过PHP流文件播放的AWS s3存储桶视频未播放音频

android - onPause() 在调用 mediaplayer.isPlaying() 时崩溃

android - 如何将线性布局转换为图像

android - 检测 GridView 滚动速度 - Android

Android - 单击按钮时播放声音 - 空指针异常

android - 从 onResume 的最后位置恢复 MediaPlayer

android - getReadableDatabase(),native_setLocale,SQLiteOpenHelper中的Android SQLiteDiskIOException

java - 将MP4转换为WAV