Java 手机的奇怪AudioManager行为

Java 手机的奇怪AudioManager行为,java,android,audio,android-audiomanager,Java,Android,Audio,Android Audiomanager,当我尝试通过STREAM_RING播放声音或文字到语音的声音,并且我的耳机已插入时,声音将同时在扬声器和耳机上播放。 这似乎是安卓框架的默认行为,但我希望只在耳机插入时播放声音 所以我试着在播放声音之前控制扬声器的状态 AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); am.setSpeakerphoneOn(false); 但这还不够,而且我的Nexus5(Kitkat 4.4.

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

所以我试着在播放声音之前控制扬声器的状态

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);
我不知道为什么模式调用中的模式会导致不稳定的声音,而模式无效工作得很好。 首先,我不知道为什么要打电话给AudioManager#setMode(int)关闭扬声器

有人知道这件事吗?Android官方参考资料中没有提及这些行为,因此我无法清楚地理解它们。

当然,我已经声明了。

如果您尝试使用流作为流音乐和模式作为模式正常播放音频,那么在插入和卸下耳机后,Android框架将只处理扬声器和耳机的音频路由。 我个人从未使用过setMode(AudioManager.MODE_INVALID),我想你不应该使用这种模式。从上面的代码中我不清楚您的流类型。 在my Github repo中查找基本音频路由: 您可以按照代码实现路由逻辑