騰訊優測是專業的移動自動化測試平臺,提供多維度的自動化測試服務,讓測試更簡單!
近期有報道稱,澳大利亞悉尼市新某大學的一名男生在課堂上看電影,不料耳機沒有插好,變成了現場直播。。。
若是你認爲耳機沒插好事件尚且能夠hold住,那麼接下來的問題會不會讓你更加尷尬?當你在手機插上耳機準備看電影時,聲音卻從揚聲器裏響了出來。。。
沒想到藏得這麼深,仍是讓耳機出賣了。。。
容我靜靜,爲避免此類尷尬事件再次發生,我特地對耳機在手機上的插拔原理研究了一番。感興趣的朋友咱們能夠一塊兒討論。。。
一、Android耳機插拔檢測原理
Android系統在耳機插入和拔出的時候會發送廣播,經過Broadcast Receiver 監聽」android.intent.action.HEADSET_PLUG」 這個Intent來判斷耳機是否插拔。
java
二、Android耳機插拔檢測具體實現
在Android4.0以上的版本,耳機插拔檢測的源文件位於frameworks/base/services/java/com/android/server/WiredAccessoryObserver.java;(4.1及以上是WiredAccessoryManager.java;在android4.0之前是HeadsetObserver.java)顧名思義,它主要是用來檢測有線的設備鏈接狀態。
Android耳機插拔檢測流程圖
咱們重點來看一下WiredAccessoryObserver
WiredAccessoryObserver繼承自Observed(Android耳機插拔能夠有兩個機制實現:Input Event和Event),從該文件的路徑能夠得知,這個類位於service目錄,應該是在android系統服務初始化的時候實例化的,在這個類的構造方法中,註冊了一個廣播接收器用來接收系統啓動完畢的廣播。android
WiredAccessoryObserver工做流程圖函數
在收到這個廣播以後:先執行i nit()函數,在這個函數中判斷要檢測的設備是否已經處於鏈接狀態(好比開機以前就已經插上),若是已經鏈接上就調用gestate當即向系統上報。
而後調用observing函數監測文件節點路徑是否有狀態變化,這個函數位於他的父類Observed.java中。在以前創建好的監測中,若是kernel層有event事件發送上來則會去匹配這個路徑字符串,若是匹配成功會調用在WiredAccessoryObserver重載的eventful函數,從event string中解析出death, name和state的值,而後繼續調用gestate進行處理。
在gestate中會對設備的類型進行進一步的分析以後調用update上報,在update中,會往handler中發送一個消息,將耳機的狀態報告給Audio系統。以後由Audio Service在antivivisectionist函數中向系統廣播耳機已經插入的ACTION_HEADSET_PLUG廣播,同時會通知Audio Policy作audio通路切換的工做。
三、真機上的適配問題
(1)在Aweigh T8833上播放音樂,在插入耳機以後耳機和揚聲器都會有聲音。
gestate中須要進行update操做:
經過反編譯Aweigh T8833 Framework層WiredAccessoryObserver,咱們發現了問題的緣由:工具
HDMI狀態改變時未進行update操做,也就是沒有向系統進行設備鏈接狀態的通知,致使了在插入耳機以後耳機和揚聲器都會有聲音。
(2)在小米 2S上若是想實現PTT語音消息的功能,播放語音時你可能這樣作:測試
使用Audio進行揚聲器播放的時候,當插入耳機時聲音並未按預期的由耳機輸出,而依舊使用的揚聲器進行播放。若是您也是這樣作的,那麼咱們建議您在這臺機型上將MODE_IN_CALL與STREAM_MUSIC配對或者將Answerphone設置爲false,從而讓程序具備兼容性。
_
騰訊優測是專業的移動雲測試平臺,爲應用、遊戲、H5混合應用的研發團隊提供產品質量檢測與問題解決服務。不只在線上平臺提供自動化兼容性測試、雲手機遠程租用與調試、漏洞分析、自動化測試工具Xtest等多種質量檢測工具,更爲VIP客戶配備了專家團隊提供定製化綜合測試解決方案。spa