如何以编程方式向Android手机的扬声器发出短促的哔哔声

时间:2015-04-08 07:56:44

标签: android

为了在扬声器上接收到唯一的短蜂鸣声,我想直接将单个位发送到扬声器。与LED闪烁相似。没有任何媒体播放器,是否有可能发出短促的哔声?

3 个答案:

答案 0 :(得分:74)

我建议你使用ToneGenerator课程。它不需要音频文件,也不需要媒体播放器,您可以自定义蜂鸣音的音量,持续时间(以毫秒为单位)和音调类型。我喜欢这个:

ToneGenerator toneGen1 = new ToneGenerator(AudioManager.STREAM_MUSIC, 100);             
toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP,150);  

您可以看到ToneGenerator对象(CMD +点击ToneGenerator。,在Mac中),并选择除TONE_CDMA_PIP之外的另一个蜂鸣声类型,150是持续时间(以毫秒为单位),{{1}音量。

答案 1 :(得分:10)

只是添加了乔希的答案。您需要使用ToneGenerator发布Handler。特别是如果你像我一样得到错误java.lang.RuntimeException: Init failed at android.media.ToneGenerator.native_setup(Native Method)

完整的代码:

import android.media.AudioManager
import android.media.ToneGenerator
import android.os.Handler
import android.os.Looper

class BeepHelper
{
val toneG = ToneGenerator(AudioManager.STREAM_ALARM, 100)

fun beep(duration: Int)
{
    toneG.startTone(ToneGenerator.TONE_DTMF_S, duration)
    val handler = Handler(Looper.getMainLooper())
    handler.postDelayed({
        toneG.release()
    }, (duration + 50).toLong())
}
}

答案 2 :(得分:0)

就我而言,由于某些原因,音调发生器声音不够大。

我最终使用了媒体播放器,并创建了一个Beeper类,可以播放指定音量的蜂鸣声。

import android.content.Context
import android.media.AudioAttributes
import android.media.AudioManager
import android.media.MediaPlayer
import android.net.Uri
import com.nfci.mesea.time.R
import kotlin.math.ln

class Beeper(val context: Context) {

    private val maxVolume = 100f
    private val mediaPlayer = MediaPlayer()

    init {

        val beep = Uri.parse("android.resource://" + context.packageName + "/" + R.raw.beep)

        val audioAttributes = AudioAttributes.Builder()
            .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
            .setLegacyStreamType(AudioManager.STREAM_ALARM)
            .setUsage(AudioAttributes.USAGE_ALARM)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .build()

        mediaPlayer.setDataSource(context, beep)
        mediaPlayer.setAudioAttributes(audioAttributes)

        mediaPlayer.prepare()
    }

    fun play(volume: Int){
        if (!mediaPlayer.isPlaying) {
            val calculatedVolume = 1 - (ln(maxVolume - volume.toFloat()) / ln(maxVolume))
            mediaPlayer.setVolume(calculatedVolume, calculatedVolume)
            mediaPlayer.start()
        }
    }
}