1

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

-= UPDATE =- 这是我的初始化代码MediaPlayers(减去 try 和 catch,因为这只会把它弄乱):

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));
4

1 回答 1

0

如果在prepare内部调用后遇到相同的错误onCompleteListener,可能是因为 next MediaPlayer(现在未准备好)被调用 before onCompleteListener

我会建议一种不同的方法,可以解决您的问题并且也更有效:

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

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

于 2013-02-25T02:59:55.343 回答