问题描述
我有播放资产目录中mp3文件的代码:
I have code that plays mp3 file from assets directory:
MediaPlayer mediaPlayer = new MediaPlayer();
descriptor = context.getAssets().openFd("beep.mp3");
mediaPlayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setVolume(soundLevel, soundLevel);
descriptor.close();
mediaPlayer.setLooping(false);
mediaPlayer.prepare();
mediaPlayer.start();
此代码在每个设备和每个Android版本上均能正常工作.直到Android L预览发布.mediaPlayer.prepare();
在运行Android L的Nexus 5上引发IllegalStateException.
This code was working fine on every device and every Android version. Until after Android L preview came available.mediaPlayer.prepare();
throws IllegalStateException on Nexus 5 running Android L.
仿真器版本的Android L可以正常使用,我没有Nexus 5,所以无法说出到底是什么引起了问题.我正在考虑在prepare()
调用之前的descriptor.close()
行,但不确定.
Emulator version of Android L works completely fine, I don't own Nexus 5 so can't say what exactly is causing the issue. I am thinking about descriptor.close()
line before prepare()
called, but not sure.
推荐答案
public void myBeep() {
try {
if (m.isPlaying()) {
m.stop();
m.release();
m = new MediaPlayer();
}
AssetFileDescriptor descriptor = getAssets().openFd("beep.mp3");
m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
descriptor.close();
m.prepare();
m.setVolume(1f, 1f);
m.setLooping(true);
m.start();
} catch (Exception e) {
e.printStackTrace();
}
};
这篇关于MediaPlayer.prepare()在Android L上引发IllegalStateException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!