Android SoundPool 不播放 wav 格式的声音

标签 android kotlin soundpool

当我单击按钮时,我尝试从原始资源文件中播放 .wav 格式的声音,但当我单击按钮时没有任何反应,并且没有 logcat 错误。

我的MainActivity.kt:

 package com.example.exampleofmusicapp

       import android.media.AudioAttributes
       import android.media.AudioManager
       import android.media.SoundPool
       import android.os.Build
       import androidx.appcompat.app.AppCompatActivity
       import android.os.Bundle
       import android.view.View


    class MainActivity : AppCompatActivity() {

    lateinit var soundPool: SoundPool

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            var audioAttrs: AudioAttributes = AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .build()

             soundPool = SoundPool.Builder()
                .setMaxStreams(2)
                .setAudioAttributes(audioAttrs)
                .build()
        }

        else{
            soundPool = SoundPool(2, AudioManager.STREAM_MUSIC, 0)
        }

    }

    fun playSound1(view: View) {
        val sound1 = soundPool.load(this, R.raw.sound1, 1)
        soundPool.play(sound1, 1.0f, 1.0f, 1, 0, 1.0f)
    }

    }

编辑:我已经在 2 个模拟器和真实设备中尝试过此操作,但它不起作用。

最佳答案

将声音文件加载到内存中需要时间,因此将 val sound1 更改为 var sound1,使其全局并在 onCreate 结束时实例化它 方法如下:

class MainActivity : AppCompatActivity() {

    lateinit var soundPool: SoundPool
    var sound1 : Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            var audioAttrs: AudioAttributes = AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .build()

            soundPool = SoundPool.Builder()
                    .setMaxStreams(2)
                    .setAudioAttributes(audioAttrs)
                    .build()
        }

        else{
            soundPool = SoundPool(2, AudioManager.STREAM_MUSIC, 0)
        }
        sound1 = soundPool.load(this, R.raw.sound1, 1)

    }

    fun playSound1(view: View) {
        if(sound1 != 0) {
            soundPool.play(sound1, 1.0f, 1.0f, 1, 0, 1.0f)
        }
    }

}

然后您可以检查 sound1 值,如果它不等于 0,则它已完全加载。您也可以使用 SoundPoolsetOnLoadCompleteListener 方法来检查这一点。

关于Android SoundPool 不播放 wav 格式的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58294035/

相关文章:

android - 尝试构建 RealmConfiguration 时,Realm 导致我的应用程序崩溃

java - 更改 FrameLayout 内的 fragment 和选项卡式导航不起作用

android - 在 Android Studio 4.0 (Canary) 中预览可以显示或无法在预览中显示内容之前需要成功构建

android - SoundPool 不播放?

java - oncreate()中可以播放soundPool吗?

java - 安卓文档 : constructor returning null for SoundPool?

多次调用 Android JobScheduler onStartJob

android - 您是否需要为 CPU 密集型服务提供 WakeLock?

使用协程的 Kotlin/Native 多线程

android - 将数字字符串格式化为2个十进制 double 字,与数字字符串长度无关