gpt4 book ai didi

java - setSpeakerphoneOn 的奇怪 AudioManager 行为

转载 作者:行者123 更新时间:2023-11-30 02:35:19 25 4
gpt4 key购买 nike

当我尝试通过 STREAM_RING 播放声音或文本转语音声音并且我的耳机已插入时,声音将同时在扬声器和耳机上播放。这似乎是 Android 框架的默认行为,但我希望在插入耳机时仅在耳机上播放声音。

所以我尝试在播放声音之前像这样控制扬声器状态。

AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
am.setSpeakerphoneOn(false);

但这还不够,无法在我的 Nexus5(Kitkat 4.4.4) 上运行。经过一番谷歌搜索后,我发现一些解决方案建议使用 AudioManager#setMode(int)。所以代码会是这样的。

AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_IN_CALL);
am.setSpeakerphoneOn(false);

基本上这段代码可以满足我的要求,但声音不稳定,经常断断续续。事实证明,下面的代码完全没问题,声音没有间断。

AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
am.setMode(AudioManager.MODE_INVALID);
am.setSpeakerphoneOn(false);

我不知道为什么 MODE_IN_CALL 导致声音不稳定而 MODE_INVALID 效果很好。首先,我不知道为什么我应该调用 AudioManager#setMode(int) 来关闭扬声器。

有人知道吗? Android 官方引用资料对这些行为只字未提,所以我无法清楚地理解它们。
当然,我已经声明了

最佳答案

如果您尝试播放流为 STREAM_MUSIC 且模式为 MODE_NORMAL 的音频,那么在您插入和取下耳机后,Android 框架将只处理音频路由到扬声器和耳机。个人从未使用过 setMode(AudioManager.MODE_INVALID),我想你永远不应该使用那个模式。我从上面的代码中不清楚你的流类型。在我的 Github 存储库中找到基本的音频路由:https://github.com/sauravpradhan/Basic-Audio-Routing您可以根据代码实现您的路由逻辑。

关于java - setSpeakerphoneOn 的奇怪 AudioManager 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26670001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com