setSpeakerphoneOn的奇怪AudioManager行为

时间:2014-10-31 08:09:01

标签: java android audio android-audiomanager

当我尝试通过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);

我不知道为什么MOD​​E_IN_CALL会导致声音不稳定,而且MODE_INVALID效果很好。 首先,我不知道为什么我应该调用AudioManager#setMode(int)来关闭免提电话。

有人知道吗? Android官方参考没有说明这些行为,所以我无法清楚地理解它们 当然我已经声明了< uses-permission android:name =“android.permission.MODIFY_AUDIO_SETTINGS”/>。

1 个答案:

答案 0 :(得分:1)

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