什么是AudioFlinger,为什么TONE_PROP_ACK失败?

Ete*_*ner 19 android dtmf android-audiomanager audioflinger

在我的应用程序中,我发出以下声明:

toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 600);
Run Code Online (Sandbox Code Playgroud)

这对于运行Android 2.3.3的便宜的LG LS670非常有效,但在我拥有的所有其他手机上都没有,从Android 2.2.1到Android 2.3.4.

所以我知道操作系统版本在这里没有发挥作用(我还在文档中验证了它自API 1以来一直受支持).

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

toneGenerator = new ToneGenerator(ToneGenerator.TONE_DTMF_1, 100);
Run Code Online (Sandbox Code Playgroud)

我确认Settings.System.DTMF_TONE_WHEN_DIALING设置为1.

此不一致的行为(在不同的手机),百思不得其解,我检查了系统日志时发生这种情况,唯一的区别怀疑我能找到是谁的手机未能声音TONE_PROP_ACK在他们的日志这一行:

AudioFlinger    setParameters(): io 25, keyvalue routing=0, tid 155, calling tid 121
Run Code Online (Sandbox Code Playgroud)

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

任何想法如何修复我的代码,使得TONE_PROP_ACK总会响起,无论手机型号的?

小智 1

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

根据Android文档ToneGenerator.TONE_PROP_ACK是:

1200Hz,100ms 开启,100ms 关闭 2 个突发

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