【发布时间】:2014-07-11 07:55:03
【问题描述】:
有 3 个 MediaPlayers,我想设置这 3 个声音使用 setNextMediaPlayer() 无缝播放。代码简单(重复代码省略)
mediaPlayer1 = new MediaPlayer();
try {
AssetFileDescriptor afd = getAssets().openFd("sound1.ogg");
mediaPlayer1.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mediaPlayer1.prepare();
afd.close();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer1.start();
mediaPlayer2 = new MediaPlayer();
//Prepare 2nd player with sound2 without calling start()
mediaPlayer3 = new MediaPlayer();
//Prepare 3rd player with sound3 without calling start()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mediaPlayer1.setNextMediaPlayer(mediaPlayer2);
mediaPlayer2.setNextMediaPlayer(mediaPlayer3); //ERROR RUNTIME!!!
在这里我得到一个错误
E/MediaPlayer﹕下一个播放器没有准备好
D/AndroidRuntime﹕关闭虚拟机
W/dalvikvm﹕threadid=1: 线程以未捕获的异常退出 (group=0x4175fda0)
E/AndroidRuntime: FATAL EXCEPTION: main 进程:com.example.testgaplesssound.app,PID:28960 java.lang.RuntimeException: 无法启动活动 ComponentInfo{...}: java.lang.IllegalStateException at...
错误提示 MediaPlayer﹕ next player is not prepared 所以我尝试设置 onPrepared 监听器
mediaPlayer2.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mediaPlayer2.setNextMediaPlayer(mediaPlayer3);
}
}
});
但永远不会启动 onPrepared!
那么,我怎样才能让第三名玩家像前两名一样无缝播放呢?
【问题讨论】:
-
你确定
mediaPlayer3的初始化没有抛出异常吗? -
是的,即使没有它,它也会在同一行中断。我发现其他人正在经历同样的未准备好非法状态错误的其他来源。如果您有 5 分钟的时间,请自行尝试。你会得到同样的错误。
-
@MikeM。你设法测试了这个吗?你也遇到同样的错误吗?
-
请问您为什么不使用
MediaPlayer.create(Context, int)方法来实例化您的播放器,而不是使用资产文件描述符? -
另外,你为什么在初始化和链接其他两个之前启动
mediaPlayer1?
标签: android android-mediaplayer