У меня есть SoundPool, который я хочу играть в разных фрагментах.Таким образом, я загружаю это в пределах одного.Какой контекст мне нужно использовать?
object PingSoundPool {
fun loadpings(note: Int) {
val context = Application()
val mAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_GAME)
.build()
val mSoundPool = SoundPool.Builder()
.setMaxStreams(9)
.setAudioAttributes(mAttributes)
.build()
val cping = mSoundPool.load(context, R.raw.cping, 1)
val dbping = mSoundPool.load(context, R.raw.dbping, 1)
[...]
if (note == 0) {}
if(note == 1)
mSoundPool.play(cping, 1f, 1f, 1, -1, 1f)
if(note == 2)
mSoundPool.play(dbping, 1f, 1f, 1, -1, 1f)
[...]
}
}
Если я использую его таким образом, загрузка его в onCreate моей деятельности, например, PingSoundPool.loadPings(0)
и доступ к нему в onClickListener с PingSoundPool.loadPings(1)
должна работать, не так ли?Во время выполнения я получаю NullPointerExeption, например:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.soulfetch2/com.example.soulfetch2.FullscreenActivity}:
java.lang.NullPointerException: Attempt to invoke virtual method
'android.content.res.Resources android.content.Context.getResources()'
on a null object reference
Исключение указывает на строку val cping = mSoundPool.load(context, R.raw.cping, 1)
R.raw.файл существует, но как-то не доступенЯ думаю, что я могу использовать неправильный контекст.Или я реализую правильный контекст неправильно.В любом случае, помощь очень ценится.
РЕДАКТИРОВАТЬ:
Первоначальный вопрос был решен, но все еще что-то не так: код, как он перезагружает SoundPool каждый раз, когда он пытается воспроизвестизвук.У кого-нибудь есть хорошая идея, как загрузить его отдельно, чтобы вызовы PingSoundPool(this).loadPings(Int)
просто воспроизводили звуки и не перезагружали все?
Другое дело: когда я выполняю PingSoundPool(this).loadPings(Int)
из действия, все работаетЧто ж.Однако из фрагмента я получаю TypeMismatch "Required: Context, Found: MainFragment".Я могу обойти это с PingSoundPool(this.requireContext()).loadPings(2)
или PingSoundPool(this.context!!).loadPings(2)
, но, похоже, это не лучшая вещь.Любые предложения?
Вот класс, который я использую вместо объекта сейчас:
class PingSoundPool(context: Context) {
val mAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_GAME)
.build()
val mSoundPool = SoundPool.Builder()
.setMaxStreams(9)
.setAudioAttributes(mAttributes)
.build()
val cping = mSoundPool.load(context, R.raw.cping, 1)
val dbping = mSoundPool.load(context, R.raw.dbping, 1)
fun loadPings(note: Int) {
if(note == 1)
mSoundPool.play(cping, 1f, 1f, 1, -1, 1f)
if(note == 2)
mSoundPool.play(dbping, 1f, 1f, 1, -1, 1f)
[...]
}
}