2014-10-31 54 views
1

當我嘗試通過STREAM_RING播放聲音或文本到語音的聲音並插入耳機時,聲音將在揚聲器和耳機上播放。 這似乎是Android框架默認行爲,但我想有聲音只在耳機玩的時候就插好。奇怪的音頻管理器行爲setSpeakerphoneOn

所以我儘量控制這樣的狀態揚聲器播放聲音之前。

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官方參考文獻對這些行爲沒有提到,所以我無法清楚地理解它們。
當然,我已經聲明<使用許可權的android:NAME = 「android.permission.MODIFY_AUDIO_SETTINGS」/ >。

回答

1

如果你想一旦你插入和取下耳機播放音頻與流作爲STREAM_MUSIC和模式MODE_NORMAL則只有音頻路由將被Android框架,以揚聲器和耳機進行處理。 個人從未使用setMode(AudioManager.MODE_INVALID),我想你永遠不應該使用該模式。我從上面的代碼中不清楚您的流類型。我在Github上回購 找到基本的音頻路由:https://github.com/sauravpradhan/Basic-Audio-Routing 您可以實現路由邏輯按代碼。