Android SoundPool 不播放 wav 格式的声音

Posted

技术标签:

【中文标题】Android SoundPool 不播放 wav 格式的声音【英文标题】:Android SoundPool is not playing wav format sound 【发布时间】:2019-10-08 21:01:39 【问题描述】:

当我单击按钮时,我正在尝试从原始资源文件播放 .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 模拟器和真实设备中尝试过,但它不起作用。

【问题讨论】:

【参考方案1】:

将声音文件加载到内存中需要时间,因此将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 格式的声音的主要内容,如果未能解决你的问题,请参考以下文章

android : 使用 SoundPool 播放具有短演变周期的短声音

Android Soundpool 问题

Android SoundPool 不播放声音

Android开发之SoundPool使用详解

蓝牙延迟和 Android 音频提示

Android 音频播放之SoundPool的使用和封装