private fun startTone() {
SoundManager.instance.loadSound(
SoundManager.SoundBuilder(R.raw.touch_tone)
.isLoop(false)
.isTogetherPlay(true) // 是否同时播放多个音效
.isBackground(true)
.build()
)
}
下面是SoundManager的类
//SoundPool最多只能播放时长10s左右、大小70kb左右
class SoundManager private constructor(poolMaxSize: Int) : Handler.Callback {
private val mSoundMap: SparseArray<SoundRequest> = SparseArray()
private val mSoundPool: SoundPool = SoundPool.Builder()
.setMaxStreams(poolMaxSize)
.setAudioAttributes(
AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC) // AudioManager.STREAM_MUSIC才能在静音时播放声效,传入STREAM_SYSTEM时静音模式下不播放
.build()
)
.build()
private val mHandler: Handler?
private var audioFocusManager: AudioFocusManager? = null
private fun findRequest(soundId: Int): SoundRequest? {
for (i in 0 until mSoundMap.size()) {
val r = mSoundMap.valueAt(i)
if (r.soundId == soundId) {
return r
}
}
return null
}
private fun playSoundDelay(request: SoundRequest?) {
if (request == null) {
return
}
if (request.delay > 0) {
mHandler?.postDelayed({
playSoundImmediately(request) }, request.delay)
} else {
playSoundImmediately(request)
}
}
private fun playSoundImmediately(request: SoundRequest?) {
if (request == null) {
// 有可能调用了destroy导致 mSoundPool 为null
return
}
audioFocusManager?.requestAudioFocus()
if (!request.isTogetherPlay) {
val req = mSoundMap.clone()
for (i in 0 until req.size()) {
val r = req.valueAt(i)
stopSound(mSoundMap[r.rawId])
}
}
val am = App.getInstance(