Android setPlaybackParams导致IllegalStateException

Android setPlaybackParams导致IllegalStateException,android,media-player,android-mediaplayer,Android,Media Player,Android Mediaplayer,我使用的媒体播放器非常典型,只有在尝试设置播放参数时才会出现问题 创建媒体播放器 MediaPlayer=新的MediaPlayer() 将DataSource设置为已知可用的本地中介文件 mMediaPlayer.prepareAsync() OnPrepared()回调调用mmediplayer.start() 如果我打电话: if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { mMediaPlayer.setPlayback

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

  • 创建媒体播放器 MediaPlayer=新的MediaPlayer()
  • 将DataSource设置为已知可用的本地中介文件
  • mMediaPlayer.prepareAsync()
  • OnPrepared()回调调用mmediplayer.start()
  • 如果我打电话:

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
         mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(2.0f));
    }
    
    在调用mMediaPlayer.start()之前,播放速度会像预期的那样受到影响,并且不会发生异常。如果我将setSpeed()调用放在mMediaPlayer.start()调用之后,应用程序将崩溃,并出现illegateStateException

    有趣的是,这只发生在手机(Nexus5,priv)上,但在测试的平板电脑(Nexus7和9)上效果良好

    我看到的一些建议提到暂停音频并等待几百毫秒,但没有任何帮助

    根据文档设置,播放音频时的播放速度完全可以接受。有人知道这里发生了什么吗?我花了太多时间调查这件事


    谢谢

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

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

    play()重新配置媒体播放器,并最终调用mMediaPlayer.asyncPrepare();这导致执行onPrepared()回调,它基本上调用mmediplayer.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。

    有人在创建MediaPlayer时遇到了
    setSpeed()
    问题,似乎可以通过使用
    getApplicationContext()
    来解决此问题-请参见此。如果
    new MediaPlayer()
    仅将活动用作上下文(至少在某些设备上),则这可能是您的解决方案。由于“如果”太多,所以没有将此作为答案发布,但我想听听它是否适用于您的情况:)不幸的是,在创建媒体播放器时使用getApplicationContext对我不起作用,感谢您参考AOSP问题跟踪程序。
    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;
                        ...