我正在制作一个游戏,我希望在背景中播放一系列歌曲,并在它们全部消失后循环播放。为此,我循环创建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));
答案 0 :(得分:0)
如果在prepare
内调用onCompleteListener
后收到同样的错误,可能是因为MediaPlayer
之前调用了现在未准备的下一个onCompleteListener
。
我建议采用不同的方法来解决您的问题并提高效率:
Circular Linked List
,这样您就可以给它当前的歌曲名称,它会为您提供下一首歌曲onPrepared
并从您的数据结构中获取下一首歌曲名称,然后使用新创建的setNextMediaPlayer
对象MediaPlayer
我相信这种方法更有效,因为您事先没有创建MediaPlayer
的许多实例。此外,每当您开始播放当前歌曲时,您都会提供准备好的nextMediaPlayer
。