2012-08-18 200 views
5

我有一個AudioTrack通過耳機播放。我必須發送一個SoundPool到內置揚聲器,而不會中斷通過耳機播放的AudioTrack。任何黑客流氓黑社會?通過耳機播放音樂時播放揚聲器

+0

所以SoundPool與AudioTrack分開嗎? – Soham 2012-08-18 09:06:42

+0

AudioManager mAudioMgr =(AudioManager)getSystemService(Context.AUDIO_SERVICE); mAudioMgr.setSpeakerphoneOn(true); mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION); – 2016-03-21 12:55:38

回答

11

許多Android設備在AudioFlinger/audio HAL中爲所有本地播放(耳機,揚聲器,有線耳機/耳機)使用單個輸出線程,使得兩個軌道的不同路由不可能同時進行(這就是爲什麼在許多設備上媒體如果播放通知並且您連接了有線耳機,則會強制靜音流,否則在播放通知時您會在揚聲器中聽到音樂)。

在某些設備上,如果你能做到一個setForceUse(FOR_MEDIA, FORCE_SPEAKER)和使用要在揚聲器播放的東西MUSIC流類型有可能做你要找的內容,併爲在VOICE_CALL流類型你想要在有線耳機中播放的東西。
我不確定是否有任何方法讓應用程序執行該調用。也許你可以通過思考得到AudioService課程的handleMessage方法,併發送給我一個MSG_SET_FORCE_USE的消息..我從來沒有嘗試過,所以它可能會失敗。

編輯:我已經測試了setForceUse強制MEDIA流到揚聲器,而有線耳機連接到實際設備上的方式,它確實工作(雖然我不能保證它可以跨越所有設備)。這個實現與我上面描述的稍有不同。查看我對how to turn speaker on/off programatically in android 4.0的回答,瞭解我使用的代碼。

+0

使用STREAM_RING有助於將聲音重定向至揚聲器,即使耳機已連接。但是,在耳機(AudioTrack)上播放的聲音會暫停,直到此STREAM_RING完成並重新開始。我的首要任務是不中斷播放耳機流。 – 2012-08-20 13:32:37

+0

是的,STREAM_RING遵循SONIFICATION路由策略,這會觸發我在我的答案的第一段中描述的行爲。我已經驗證過,在有線耳機中強制使用揚聲器+ VOICE_CALL流的MUSIC流在XPeria P上正常工作,但我沒有在任何其他設備上進行測試。 – Michael 2012-08-20 14:06:07

+0

Mike,我很抱歉把你推得太緊,但是,我一直在S2和HTC One X上進行測試。他們都在暫停耳機上的音頻。礦井是一個突破連續性的信號將違反系統的工作過程。 – 2012-08-22 11:37:09

相關問題