gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:54:33 25 4
gpt4 key购买 nike

我希望 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com