0

问题

一旦按下按钮,我一直在尝试在我正在开发的应用程序上实现双哔声。

问题是,我没能做到完全正确。有时声音重叠,有时它们播放得比他们应该的更快。

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

OBS我已经看到一些使用MediaPlayerorRingtone类的解决方案,但这个问题是关于如何ToneGenerator仅使用而不使用TONE_PROP_BEEP2orTONE_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)
}

两种想法都“有点”奏效。但是在第一次按下按钮时,哔哔声听起来很有趣,因为它们播放得太快了,有时甚至重叠。

我第二次按 时Button,音调播放正确。

4

3 回答 3

0

你可以试试CountDownTimer看看它是否效果更好。我实际上尝试了您的第一个选项,并没有注意到您提到的影响。我不确定postDelayed除了“导致 Runnable r 添加到消息队列,在指定的时间过去后运行”之外做出任何承诺,您也可以尝试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)
    }
于 2017-11-04T13:13:16.147 回答
0

这对我有用:

val tg = ToneGenerator(AudioManager.STREAM_ALARM, 1000)
tg.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 2000)
于 2018-12-20T19:19:31.727 回答
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)
于 2019-11-22T04:23:59.480 回答