尝试使用MediaPlayer播放声音时出现NullPointerException

时间:2011-09-30 05:12:03

标签: android media-player nullpointerexception

所以我有一个简单的音板类型应用程序,它通过ListView进行操作。点按一个项目,它会播放声音。我有一个名为soundResourceList的public static int [],其条目如R.raw.foo,R.raw.bar与ListView中与文本相关的条目的顺序相同。

此代码适用于包括我自己在内的许多用户,但最近发布了一个NullPointerException,特别是来自setOnCompletionListener行。这对我来说意味着MediaPlayer.create返回null,但我无法弄清楚为什么它会在他们的设备上失败而不是其他人的。

public void onListItemClick(ListView parent, View v, int position, long id) {
    MediaPlayer mp = MediaPlayer.create(getBaseContext(), soundResourceList[position]);
    mp.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
        }
    });
    mp.setOnPreparedListener(new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });
}

通常情况下,使用MediaPlayer的NPE是由于没有发布其先前的实例,但我已经按照代码中的说明处理了该问题。那么我错过了什么可能导致MediaPlayer.create()失败?

1 个答案:

答案 0 :(得分:2)

create方法文档说:

Returns
    a MediaPlayer object, or null if creation failed

由于可能会为每个MediaPlayer分配许多低级资源,因此如果GC暂停一段时间或者没有运行,您可能会耗尽声音缓冲区(或其他任何内容)和MediaPlayer分配将失败,返回null。

如果这些都是相对较短的音频片段,您可以查看android.media.SoundPool