MediaPlayer.prepare()在Android L上引发IllegalStateException [英] MediaPlayer.prepare() throws IllegalStateException on Android L

查看:626
本文介绍了MediaPlayer.prepare()在Android L上引发IllegalStateException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有播放资产目录中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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆