播放循环音轨

时间:2013-02-24 20:42:33

标签: android android-mediaplayer

我正在制作一个游戏,我希望在背景中播放一系列歌曲,并在它们全部消失后循环播放。为此,我循环创建MediaPlayer并使用列表中的下一个玩家调用setNextMediaPlayer,除非它是最后一个项目;然后我将它设置回列表中的第一项。这有效,但是当它循环并尝试再次播放第一首歌时,它告诉我,我将play()称为无效状态。所以我添加了一个OnCompleteListener所以当一首歌结束时我再次打电话给prepare(),但这没有帮助。对于已经到达终点的MediaPlayer我需要做些什么才能让它再次播放?

- = UPDATE = - 这是我的初始化MediaPlayers的代码(减去尝试和捕获,因为它只会弄乱它):

String[] assets = manager.list("songs");
Collections.shuffle(Arrays.asList(assets));

for(String name : assets)
{
    MediaPlayer player = new MediaPlayer();
    AssetFileDescriptor descriptor = manager.openFd("songs/"+name);

    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
    player.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
    player.setOnCompletionListener(_reset);
    player.prepare();

    if(_songs.size() > 0)
    {
        _songs.get(_songs.size() - 1).setNextMediaPlayer(player);
    }

    _songs.add(player);
}

_songs.get(_songs.size() - 1).setNextMediaPlayer(_songs.get(0));

1 个答案:

答案 0 :(得分:0)

如果在prepare内调用onCompleteListener后收到同样的错误,可能是因为MediaPlayer之前调用了现在未准备的下一个onCompleteListener

我建议采用不同的方法来解决您的问题并提高效率:

  • 维护某些数据结构中的歌曲顺序,例如Circular Linked List,这样您就可以给它当前的歌曲名称,它会为您提供下一首歌曲
  • 准备并开始播放第一首歌
  • 覆盖onPrepared并从您的数据结构中获取下一首歌曲名称,然后使用新创建的setNextMediaPlayer对象
  • 调用MediaPlayer

我相信这种方法更有效,因为您事先没有创建MediaPlayer的许多实例。此外,每当您开始播放当前歌曲时,您都会提供准备好的nextMediaPlayer