私は Android アプリに取り組んでおり、SoundPool を使用してバックグラウンドで音楽を再生しようとしています (これには MediaPlayer の方が適していることはわかっていますが、イライラするので、このクラスの使用方法を本当に理解したいと思っています)。静的な Music クラスを使用して 2 つの 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ファイルはどちらも400KB以下なのでサイズ的には問題ないと思います。どんな助けでも大歓迎です。