19

在我的申请中,我发出以下声明:

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600);

这在运行 Android 2.3.3 的廉价 LG LS670 上运行良好,但在我拥有的所有其他手机(从 Android 2.2.1 到 Android 2.3.4)上完全没有声音。

所以我知道操作系统版本在这里不起作用(我还在文档中验证了它从 API 1 开始就受到支持)。

此外,铃声音量和媒体音量都设置为最大值,并且toneGenerator 初始化为:

toneGenerator = new ToneGenerator(ToneGenerator.TONE_DTMF_1, 100);

我验证了Settings.System.DTMF_TONE_WHEN_DIALING它设置为 1。

对这种不一致的行为(在不同的手机上)感到困惑,我检查了发生这种情况时的系统日志,我能够发现的唯一可疑的区别是那些无法发声的手机TONE_PROP_ACK在他们的日志中有这条线:

AudioFlinger    setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121

AudioFlinger的目的是什么,它与静音有什么联系TONE_PROP_ACK

知道如何修复我的代码,以便无论手机型号如何,TONE_PROP_ACK 总是响起吗?

4

2 回答 2

1

一种解决方法是在 Audacity 之类的东西中生成音调,并通过 SoundPool 或您选择的 api 播放它。

根据 Android 文档 ToneGenerator.TONE_PROP_ACK 是:

1200Hz,100ms ON,100ms OFF 2 个脉冲

如果您选择 SoundPool,我建议保存为 ogg 文件格式并循环播放音调直到完成。这同时以非常小的剪辑提供无缝音频,并且不使用大量资源。

于 2013-02-08T21:49:48.057 回答
0

解析/解码由媒体播放器服务使用的 Stage fright 处理。解码后的数据通过 Audio Sink 写入 Audio Track,然后由 Audio Flinger 的混音器线程混合音轨并写入输出流(音频硬件)。输出流对象填满自己的缓冲区,然后将数据写入 PCM 输出设备文件(可能是也可能不是 ALSA 驱动程序)。

于 2014-10-02T04:00:48.653 回答