我为一个用于移动数据收集的开源 Android 应用程序做出了贡献。它可以做的事情之一是自动播放问题的音频提示。我们最近看到有许多音频提示的表单崩溃。用户报告说这些崩溃是不可预测的并且无法重现。
我们看到
IllegalStateException
是从 Android 的 MediaPlayer.setDataSource
或 MediaPlayer.reset()
抛出的。没有异常信息。
reset
总是在这两个调用之前调用:
mediaPlayer.reset()
mediaPlayer.setDataSource(uri)
mediaPlayer.prepare()
完整来源。
上面的代码是从 UI 线程中调用的。看看 Android 源,我看不出
IllegalStateException
会从哪里抛出。我能想到的唯一可能的问题是某种并发问题。关于如何解决此问题或重现它有什么想法吗?
我只是猜测:
重置可能需要更长的时间,这就是导致问题的原因:使用此代码在成功重置后进行准备工作:
mediaPlayer.reset();
mediaPlayer.setOnResetListener(new MediaPlayer.OnResetListener() {
@Override
public void onReset(MediaPlayer mp) {
// Reset is complete, safe to setDataSource
mediaPlayer.setDataSource(uri);
mediaPlayer.prepareAsync(); // or prepare() depending on your use case
}
});