Я занимаюсь разработкой приложения для тренировки слуха и хочу, чтобы пользователь сам решал, какие звуки он хочет идентифицировать (различные инструменты, звуки синтезатора и т. Д.).эхолотный пинг, который я загружаю в SoundPool:
open class PingSoundPool(context: Context) {
open var mAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_GAME)
.build()
open var mSoundPool = SoundPool.Builder()
.setMaxStreams(9)
.setAudioAttributes(mAttributes)
.build()
open var babping = mSoundPool.load(context, R.raw.ab830ping, 1)
open var aaping = mSoundPool.load(context, R.raw.a220ping, 1)
open var abbping = mSoundPool.load(context, R.raw.bb233ping, 1)
open var abping = mSoundPool.load(context, R.raw.b247ping, 1)
[and others]
open fun loadPings(note: Int) {
println(note.toString())
if (note == 0) {}
if(note == 1)
mSoundPool.play(acping, 2.55f, 2.55f, 1, 0, 1f)
if(note == 2)
mSoundPool.play(adbping, 2.5f, 2.5f, 1, 0, 1f)
if(note == 3)
mSoundPool.play(adping, 2.45f, 2.45f, 1, 0, 1f)
if(note == 4)
mSoundPool.play(aebping, 2.4f, 2.4f, 1, 0, 1f)
[and so on]
}
Теперь я делаю это доступным в своей деятельности:
companion object {
lateinit var pingSoundPool: PingSoundPool
}
И в onCreate выполняю pingSoundPool = PingSoundPool(this)
Таким образом, я могу воспроизводить любой из этих звуков с помощью FullscreenActivity.pingSoundPool.loadPings(note: Int)
Теперь проблема возникает, когда я хочу изменить звук.Первым шагом является создание элемента предпочтения, дающего мне строку с нужным звуком («пинг», «понг», «флейта», «скрипка» и т. Д.).Второй шаг - получение указанной строки и соответствующая загрузка SoundPool.
Теперь, если я попытаюсь вставить это -
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val pingsound = sharedPreferences.getString("pingsound", "")
if(pingsound == "ping"){
open var babping = mSoundPool.load(context, R.raw.ab830ping, 1)
open var aaping = mSoundPool.load(context, R.raw.a220ping, 1)
open var abbping = mSoundPool.load(context, R.raw.bb233ping, 1)
open var abping = mSoundPool.load(context, R.raw.b247ping, 1)
[etc]
}
- в мой класс SoundPool, я получу сообщение об ошибке "Ожидается объявление члена. "/" Объявление функции должно иметь имя. "
Если вместо этого я просто скопирую содержимое всего класса и создаю новый класс, подобный этому
class PongSoundPool(context: Context): PingSoundPool(context) {
override var mAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_GAME)
.build()
override var mSoundPool = SoundPool.Builder()
.setMaxStreams(9)
.setAudioAttributes(mAttributes)
.build()
open var babping = mSoundPool.load(context, R.raw.ab830pong, 1)
open var aaping = mSoundPool.load(context, R.raw.a220pong, 1)
open var abbping = mSoundPool.load(context, R.raw.bb233pong, 1)
open var abping = mSoundPool.load(context, R.raw.b247pong, 1)
и присвойте значение pingSoundPool
в моей деятельности следующим образом:
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
val pingsound = sharedPreferences.getString("pingsound", "")
when (pingsound) {
"ping" -> pingSoundPool = PingSoundPool(this)
"pong" -> pingSoundPool = PongSoundPool(this)
}
Затем, когда я изменяю настройки на "pong", ничего не происходит.При перезапуске приложения я получаю ошибку времени выполнения:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.FullscreenActivity}: java.lang.IllegalArgumentException: Invalid null AudioAttributes
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.IllegalArgumentException: Invalid null AudioAttributes
at android.media.SoundPool$Builder.setAudioAttributes(SoundPool.java:601)
at com.example.PingSoundPool.<init>(PingSoundPool.kt:16)
at com.example.PongSoundPool.<init>(PongSoundPool.kt:7)
at com.example.FullscreenActivity.onCreate(FullscreenActivity.kt:97)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Строка, на которую он указывает в PingSoundPool, такова: .setAudioAttributes(mAttributes)
Теперь у меня нет идей, как это реализовать.Кто-нибудь получил помощь?