如何使用ToneGenerator发出双响声

时间:2017-11-03 12:30:05

标签: java android audio kotlin tone-generator

问题

我一直试图在我按下按钮后开发的应用上发出双哔声。

问题是,我没有设法让它变得非常正确。有时声音会重叠,有时候播放的速度比应该的快。

我想播放任意音调,有任意暂停/延迟,然后再次播放音调。

OBS I've seen some solutions使用MediaPlayerRingtone类解决此问题,但这个问题是关于如何使用{{1}实现此目的仅限,不使用ToneGeneratorTONE_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) } 时,音调播放正确。

3 个答案:

答案 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)