Who*_*ome 4 android media-player android-mediaplayer
我对媒体播放器的使用非常典型,只有在尝试设置播放参数时才会出现问题。
如果我打电话:
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
mMediaPlayer.setPlaybackParams(new PlaybackParams().setSpeed(2.0f));
}
Run Code Online (Sandbox Code Playgroud)
在我调用 mMediaPlayer.start() 之前,播放速度会按预期受到影响,并且不会发生异常。如果我在 mMediaPlayer.start() 调用之后放置 setSpeed() 调用,应用程序将因 illegateStateException 崩溃。
有趣的是,这仅发生在手机(nexus 5,priv)上,但在测试的平板电脑(nexus 7 和 9)上运行良好。
我看到的一些建议提到暂停音频并等待几百毫秒,但没有帮助。
根据文档,在播放音频时设置播放速度是完全可以接受的。有谁知道这里发生了什么?我花了太多时间调查这个。
谢谢!
我对这个问题的解决方案最终是确保当通过滑块小部件更改速度时,媒体播放器被重置(通过 mMediaPlayer.reset()),然后重新配置、暂停或停止是不够的。
在滑块回调中,我现在存储用户指定的速度,重置媒体播放器并调用 play 以恢复媒体播放器在重置前停止的位置。(以前这里是播放参数改变的地方,导致崩溃的原因)
public void onStopTrackingTouch(DiscreteSeekBar discreteSeekBar) {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) {
mSpeed = speed;
mMediaPlayer.reset();
play(mCurrentMediaId);
}
}
Run Code Online (Sandbox Code Playgroud)
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;
...
Run Code Online (Sandbox Code Playgroud)
tl;博士; MediaPlayer.reset() 在某些设备上更改播放参数之前。
| 归档时间: |
|
| 查看次数: |
1820 次 |
| 最近记录: |