尝试通过setNextMediaPlayer设置第三个玩家时出现IllegalStateException?

时间:2014-07-11 07:55:03

标签: android android-mediaplayer

有3个MediaPlayer,我想设置这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:关闭VM
  W / dalvikvm:threadid = 1:线程退出时未捕获异常(组= 0x4175fda0)
  E / AndroidRuntime:致命异常:主要           处理: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永远不会发起!

那么,我怎样才能让第3名玩家像前两名一样无缝地玩?

1 个答案:

答案 0 :(得分:3)

我刚刚测试了以下设置,没有任何错误,认为您的问题是初始化。但后来我注意到你在初始化和链接其他两个玩家之前就开始了你的第一个玩家。重新排序您的代码可能会解决您的问题,但我也会发布这个问题,因为这似乎是一个简单的解决方案,至少对我来说。

将您的音频文件移至/res/raw文件夹,然后初始化并启动您的播放器:

MediaPlayer mediaPlayer1, mediaPlayer2, mediaPlayer3;

mediaPlayer1 = MediaPlayer.create(this, R.raw.sound1);
mediaPlayer2 = MediaPlayer.create(this, R.raw.sound2);
mediaPlayer3 = MediaPlayer.create(this, R.raw.sound3);
mediaPlayer1.setNextMediaPlayer(mediaPlayer2);
mediaPlayer2.setNextMediaPlayer(mediaPlayer3);

mediaPlayer1.start();

注意:我在API 19下进行了测试,因此如果您重新支持,您仍然需要进行版本检查。