java - 是否可以让 MediaPlayer 播放一个音频文件并在播放完后播放下一个?

标签 java android audio android-mediaplayer

我希望 MediaPlayer 接受一个 songTitles 数组列表并让它检查出现的歌曲名称,然后播放该歌曲。完成后,我希望它转到循环中的下一首歌曲并播放该歌曲。但是,我的代码只播放最后一首歌。

public void play(Context c, ArrayList<String> songTitles) {
    stop();

    for (String song: songTitles){
        if (song.equalsIgnoreCase("shakeItOff")){
            mSongPlayer = MediaPlayer.create(c, R.raw.shaketoff);

        } else if (song.equalsIgnoreCase("dropItLow")){
            mSongPlayer = MediaPlayer.create(c, R.raw.dropitlow);

        } else if (song.equalsIgnoreCase("chachaslide")){
            mSongPlayer = MediaPlayer.create(c, R.raw.chachaslide);
        }

        mSongPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                if (mp == mSongPlayer) {
                    mSongPlayer.start();
                }
            }
        });

        mSongPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stop();
            }
        });


    }
}

最佳答案

你需要使用 MediaPlayer.OnCompletionListener 来在前一首轨道结束时开始新轨道,所以你可以做更多类似下面的事情(我没有编译它,所以可能有一些语法错误):

public void play(final Context c, ArrayList<String> songTitles) {
    stop();
    if (songTitles != null && songTitles.size > 0) {
        final List<String> playList = new ArrayList<String>(songTitles);

        String song = playList.get(0);
        playList.remove(0);

        mSongPlayer = MediaPlayer.create(c, getSongResourceId(song));

        mSongPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                if (mp == mSongPlayer) {
                    mSongPlayer.start();
                }
            }
        });

        mSongPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                stop();
                // Recursively call the play() method with one less
                // track in the list.
                play(c, playList);
            }
        });
    } 
} 

public int getSongResourceId(String songTitle) {
    if (song.equalsIgnoreCase("shakeItOff")){
        return R.raw.shaketoff;
    } else if (song.equalsIgnoreCase("dropItLow")){
        return R.raw.dropitlow;
    } else if (song.equalsIgnoreCase("chachaslide")){
        return R.raw.chachaslide;
    }
}

第一次播放列表中的第一首轨道,然后在 MediaPlayer.OnCompletionListener 中,递归调用 play() 方法已从中删除第一首轨道的列表。这意味着每次 play() 被调用时,列表都会变短,直到我们到达列表的末尾。

关于java - 是否可以让 MediaPlayer 播放一个音频文件并在播放完后播放下一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31419328/

相关文章:

android - 将自定义应用程序类添加到生产应用程序

java - Java 可以处理多少个音频片段?

actionscript-3 - 导入的AS3 SoundChannel/Sound HZ限制

java - Spring JPA 注释和 ORM.xml 替代方案?

android - 如何制作android菜单,以及如何在这个菜单中选择一个项目时打开新屏幕

java - Android - 访问 fragment 中的 View

javascript - 使用jQuery通过.submit()事件播放音频

java - 打开第二个 JFrame 并且组件不显示

java - 为什么 Java 可以正确获取一个网页的内容,但不能正确获取另一个网页的内容?

java - 不允许 Spring Data REST PUT 方法