我一直试图在我按下按钮后开发的应用上发出双哔声。
问题是,我没有设法让它变得非常正确。有时声音会重叠,有时候播放的速度比应该的快。
我想播放任意音调,有任意暂停/延迟,然后再次播放音调。
OBS :I've seen some solutions使用MediaPlayer
或Ringtone
类解决此问题,但这个问题是关于如何使用{{1}实现此目的仅限,不使用ToneGenerator
或TONE_PROP_BEEP2
音调。
首先,我尝试两次调用TONE_PROP_ACK
方法,但很快我发现声音同时播放。
startTone()
然后我尝试以两种方式使用button.setOnClickListener {
val toneG = ToneGenerator(AudioManager.STREAM_ALARM, 100)
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}
。
首先我尝试使用其中两个:
Handler
其次,我也试过了button.setOnClickListener {
val toneG = ToneGenerator(AudioManager.STREAM_ALARM, 100)
val handler = Handler()
handler.postDelayed({
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}, 50)
handler.postDelayed({
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}, 350)
}
:
Thread.sleep()
这两个想法"有点"工作。但是在按下第一个按钮时,哔哔声听起来很有趣,因为它们播放速度太快,有时甚至重叠。
第二次按下button.setOnClickListener {
val toneG = ToneGenerator(AudioManager.STREAM_ALARM, 100)
val handler = Handler()
handler.postDelayed({
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
Thread.sleep(100)
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}, 50)
}
时,音调播放正确。
答案 0 :(得分:0)
您可以尝试CountDownTimer,看看它是否效果更好。
我实际上尝试了你的第一个选项,并没有注意到你提到的影响。我不确定postDelayed是否做出除 &#34之外的任何承诺;导致Runnable r被添加到消息队列中,在指定的时间量过后运行&#34; < / em> ,您也可以尝试使用postAtTime()
代替postDelayed()
button.setOnClickListener {
val toneG = ToneGenerator(AudioManager.STREAM_ALARM, 100)
val timer = object: CountDownTimer(350,50) {
var skipThisInterval = false
override fun onFinish() {
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}
override fun onTick(p0: Long) {
if (skipThisInterval) return
skipThisInterval = true
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}
}
timer.start()
}
使用postAtTime()
而不是postDelayed()
可能也会更好。
button.setOnClickListener {
val toneG = ToneGenerator(AudioManager.STREAM_ALARM, 100)
val handler = Handler()
val timeNow = SystemClock.uptimeMillis()
handler.postAtTime({
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}, 50 + timeNow)
handler.postAtTime({
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200)
}, 350 + timeNow)
}
答案 1 :(得分:0)
这对我有用:
val tg = ToneGenerator(AudioManager.STREAM_ALARM, 1000)
tg.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 2000)
答案 2 :(得分:0)
val toneGen1 = ToneGenerator(AudioManager.STREAM_MUSIC, 100)
toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP, 150)
Handler().postDelayed({
val toneGen1 = ToneGenerator(AudioManager.STREAM_MUSIC, 100)
toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP, 150)
}, 150)