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

Android 尝试使用MediaPlayer播放声音时出现NullPointerException,android,media-player,nullpointerexception,Android,Media Player,Nullpointerexception,因此,我有一个简单的soundboard类型的应用程序,通过ListView进行操作。轻触一个项目,它会播放声音。我有一个名为soundResourceList的公共静态int[],它的条目如R.raw.foo、R.raw.bar的顺序与ListView中与文本关联的条目的顺序相同 这段代码适用于包括我在内的许多用户,但是最近有一个用户发布了一个NullPointerException,特别是在setOnCompletionListener行中。这对我来说意味着MediaPlayer.creat

因此,我有一个简单的soundboard类型的应用程序,通过ListView进行操作。轻触一个项目,它会播放声音。我有一个名为soundResourceList的公共静态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()失败呢?

方法文档说:

Returns
    a MediaPlayer object, or null if creation failed
由于可能会为每个MediaPlayer分配大量低级资源,因此如果GC忙了一段时间或没有运行,则可能会耗尽声音缓冲区(或其他),MediaPlayer分配将失败,返回null


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

可能是MP没有在系统级别发布,这就是为什么将NPEI放入SoundPool中,但由于某些原因,文件被截短,所以我放弃了使用它。