【问题标题】:IllegalStateException while trying to set 3rd player via setNextMediaPlayer?尝试通过 setNextMediaPlayer 设置第三个播放器时出现 IllegalStateException?
【发布时间】: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


【解决方案1】:

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

将您的音频文件移动到/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 下进行了测试,因此如果您支持回溯,您仍需要检查版本。

【讨论】:

  • 天啊,我不敢相信这是由于初始化:)。顺便说一句,如果您而不是 mediaPlayer3 放入 mediaPlayer1 (创建循环),它是否适用于您的情况?
  • 我做了一个快速测试,但这对我不起作用。但是,我对这个答案的搜索更少:stackoverflow.com/questions/20034519/…
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多