setPlaybackParams导致IllegalStateException

时间:2016-09-12 02:10:23

标签: android media-player android-mediaplayer

我对媒体播放器的使用非常典型,只在尝试设置播放参数时出现问题。

  1. 制作媒体播放器 MediaPlayer mMediaPlayer = new MediaPlayer();
  2. setDataSource为知道可以工作的本地中介文件
  3. mMediaPlayer.prepareAsync();
  4. OnPrepared()回调调用mMediaPlayer.start()
  5. 如果我打电话:

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
         mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(2.0f));
    }
    

    在我调用mMediaPlayer.start()之前,播放速度会受到预期影响,并且不会发生异常。如果我在mMediaPlayer.start()调用之后放置了setSpeed()调用,则应用程序崩溃并发生illegateStateException。

    有趣的是,这只发生在手机上(nexus 5,priv),但在测试的平板电脑上工作正常(nexus 7和9)。

    我见过的一些建议提到暂停音频并等待几百毫秒,这没有帮助。

    根据文档设置播放音频时的播放速度是完全可以接受的。有谁知道这里发生了什么?我花了太多时间来研究这个问题。

    谢谢!

1 个答案:

答案 0 :(得分:4)

我对此问题的解决方案最终确保当通过滑块小部件更改速度时,媒体播放器已重置(通过mMediaPlayer.reset()),然后重新配置,暂停或停止是不够的。

在滑块回调中,我现在存储用户指定的速度,重置媒体播放器并调用播放以恢复媒体播放器在重置之前停止的位置。 (以前这是播放参数被更改并且崩溃源自的地方)

public void onStopTrackingTouch(DiscreteSeekBar discreteSeekBar) {
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
         mSpeed = speed;
         mMediaPlayer.reset();
         play(mCurrentMediaId);
    }
}

play()重新配置媒体播放器并最终调用mMediaPlayer.asyncPrepare();这导致onPrepared()回调被执行,它基本上调用mMediaPlayer.start(),在此调用之前我配置了回放参数:

在onPrepared()回调中:

if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
        mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(mSpeed));
    }
    mMediaPlayer.start();
    mState = PlaybackState.STATE_PLAYING;
                    ...

TL;博士;在更改某些设备上的播放参数之前,MediaPlayer.reset()。