【问题标题】:Weird AudioManager behaviour of setSpeakerphoneOnsetSpeakerphoneOn 的奇怪 AudioManager 行为
【发布时间】:2015-08-13 19:58:17
【问题描述】:

当我尝试通过 STREAM_RING 播放声音或 Text-To-Speech 声音并且我的耳机已插入时,声音将在免提电话和耳机上播放。 这似乎是 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官方参考对这些行为只字未提,因此我无法清楚地理解它们。
当然我已经声明了

【问题讨论】:

    标签: java android audio android-audiomanager


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 2021-06-08
      • 2015-07-20
      • 2010-10-03
      • 2021-07-12
      相关资源
      最近更新 更多