0

我正在开发一个 Android 应用程序并尝试使用 SoundPool 在后台播放一些音乐(我知道 MediaPlayer 会更好,但我真的想弄清楚如何使用这个类,因为它让我感到沮丧)。我正在尝试使用静态音乐类加载两个 mp3 文件,并将它们的声音 ID 存储在 HashMap 中,以便在它们准备好使用时访问它们。但是,将它们放在 HashMap 中会给我一个 NullPointerException。

public static void play(Context context, int resource) {
    if (sp == null) {
        sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        sp.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                loaded = true;
            }
        });
        sounds.put(R.raw.main, sp.load(context, R.raw.main, 1));
        sounds.put(R.raw.game, sp.load(context, R.raw.game, 1));
        am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        float volume = am.getStreamVolume(AudioManager.STREAM_MUSIC) / am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        sp.play(sounds.get(resource), volume, volume, 0, -1, 1.0f);
    } else {
        float volume = am.getStreamVolume(AudioManager.STREAM_MUSIC) / am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        sp.play(sounds.get(resource), volume, volume, 0, -1, 1.0f);
    }
}

具体来说,我得到一个 NullPointerException 就行了sounds.put(R.raw.main, sp.load(context, R.raw.main, 1));

我尝试在加载声音文件后立即使用 while 循环,该循环只是循环直到“加载”为真,但这只会导致应用程序永远挂起。此外,这两个 mp3 文件都是 400 KB 或更少,所以我认为它们的大小不是问题。任何帮助将不胜感激。

4

1 回答 1

0

尝试这个

sounds.load(collection.getContext(), R.raw.main, 1);

或者这个方法

int sound_id = mContext.getResources().getIdentifier("myownsound", "raw",
                                                     mContext.getPackageName());
soundPool.load(mContext, sound_id, 1);

或者看看这个链接

音池

于 2013-09-09T02:31:07.653 回答