2014-10-16 55 views
11

我使用的廣播接收器(電話狀態偵聽器)下面的代碼干擾,使揚聲器:使用AudioManager與通話音頻

final Handler mHandler = new Handler(); 
mHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
     audioManager.setMode(AudioManager.MODE_IN_CALL); 
     audioManager.setSpeakerphoneOn(true); 
    } 
}, 500); 

當新的呼出通過我的應用程序開始出現這種情況。當呼叫斷開時,我關閉揚聲器:

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
audioManager.setMode(AudioManager.MODE_NORMAL); 
audioManager.setSpeakerphoneOn(false); 

這一切似乎都很好......第一次。之後,我手機的音頻流似乎陷入了混亂。後續調用很奇怪,即使是從我的應用程序代碼之外進行的調用(上述設置未觸發)。我可以隨意看到迴音,但我不確定是什麼導致它返回。

關於我可能做錯什麼的想法?有沒有我不知道的Android錯誤?如何避免爲隨後的通話靜音我的音頻?

編輯:我在Galaxy S4上測試。

回答

2

我已經解決了這個問題。看來,是搞砸了我的音樂代碼是這一行:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

我曾使用過這種方法,因爲我無法得到的揚聲器設置,沒有它成功吸引(我發現了一個建議設置模式另一個堆棧溢出的答案...它的工作,但有問題的後果)。

我真的不得不做的是刪除這條線,並將處理延遲從500增加到2000

我還維護了一個靜態引用到AudioManager,建議在this answer。在這種特殊情況下似乎沒有必要,但是比對不起更安全。

1

的,我會複製從setMode的documentation這樣的文字,只是要確定你有考慮它首先:

The audio mode encompasses audio routing AND the behavior of the telephony layer. 
Therefore this method should only be used by applications that replace the platform-wide 
management of audio settings or the main telephony application 

換句話說,只有在系統上UNE應用程序應該與玩弄這種方法。如果不這樣做,一致性不能保證。

然後,我會檢查你的不同音頻流,以防你有一些音頻流太低(STREAM_VOICE_CALL,STREAM_SYSTEM,STREAM_RING,STREAM_MUSIC或STREAM_ALARM)。也許嘗試使用setStreamMute而不是setSpeakerphoneOn。

這將有助於瞭解你的應用程序實際上是在更換the platform-wide management of audio settings or the main telephony application

+0

感謝您的回答。當我最終解決了自己的問題時,你的回答激勵着我朝着正確的方向前進。做得好。 – 2014-10-21 19:55:52