1. 程式人生 > >rk3328_Android 8.1音量大小調節控制

rk3328_Android 8.1音量大小調節控制

最近公司要升級android 8.1版本,雖說有以前成熟的版本(android 4.4,android 7.1等)程式碼大同小異,但是由於程式碼的不熟悉,加上是第一次進行版本驗證,還是有不小的挑戰,好在功夫不負有心人。話不多說,直接進入主題。

Android音量調節網上也有許多資料,想必大家也清楚,通過遙控音量按鍵呼叫AudioManager.java中的public void preDispatchKeyEvent(KeyEvent event, int stream)函式

然後呼叫adjustSuggestedStreamVolume(),這個adjustSuggestedStreamVolume()直接呼叫到AudioService.java中的adjustSuggestedStreamVolume()進行音量的具體操作,把音量值傳遞到AudioManagerPolicy.cpp去實現。但是若preDispatchKeyEvent()都沒呼叫,這一切都是空談,沒錯,我就遇到這個大坑,畢竟我主要是搞底層,上層應用,java的東西都是現學現用,網上也沒有查不到這個函式是怎麼呼叫的,f-u-c-k!

硬著頭皮,賴著性子查詢,通過framework/base/目錄grep preDispatchKeyEvent關鍵字,查到AudioManager.java中的preDispatchKeyEvent是由core/java/com/android/internal/policy/PhoneFallbackEventHandler.java呼叫,而這個函式沒有做什麼實際的操作,它在由core/java/android/view/ViewRootImpl.java呼叫

通過加在processKeyEvent()加log發現,這個函式也沒有被呼叫,擦,懵逼了。問了師傅後,發現方向錯了,因為上層按鍵的派發是phonewindowsmanager那邊傳遞過來,所以查詢方向可能有錯。

那就回到最初的起點,那就對比下8.0的程式碼,在AudioService.java中adjustSuggestedStreamVolume()加堆疊,

找到

原來在PhoneWindowManager.java中呼叫過來的,繼續找到dispatchDirectAudioEvent如下地方呼叫過來的,這裡有個判斷的方法,通過對比發現,8.1的變數為mUseTvRouting為flase,而8.0的為true,所以8.1的沒有呼叫!!!

其實到這裡問題已經很明顯了,查詢mUseTvRouting賦值的地方。

AudioSystem.PLATFORM_TELEVISION的定義為2,那顯然AudioSystem.getPlatformType(mContext)不為2,繼續更進AudioSystem.getPlatformType(mContext)程式碼,具體實現在AudioSystem.java中,

走到了PLATFORM_DEFAULT的case,那就不滿足hasSystemFeature(PackageManager.FEATURE_LEANBACK)這個條件,顯然FEATURE_LEANBACK是PackageManager類的一個變數,grep查詢關鍵字FEATURE_LEANBACK,找到在該定義的地方

這個字串android.software.leanback很明顯是xml配置檔案中定義,於是到產品配置xml的目錄下去查詢,找到這個字串被註釋掉了,汗~~~問題搞定。