天天看點

rk3328_音量調節大小音量條不顯示

上一篇搞定了音量無法調節,但是調節音量的時候音量條不顯示,郁悶,全是坑。周末又不得不加班了。。。。

我們已經知道音量調節的具體實作函數是AudioService.java中adjustStreamVolume(),居然音量能調節,那說明設定的音量值能夠傳遞下去,但是發送的消失沒有去繪制UI,導緻了音量條沒有顯示,是以,從代碼入手,找到發送消息的地方。在adjustStreamVolume()中

rk3328_音量調節大小音量條不顯示

的adjustIndex有個判斷,當音量調節時,會把消息發送下去。進入adjustIndex()函數。具體的實作函數為public boolean setIndex(int index, int device, String caller)

rk3328_音量調節大小音量條不顯示

具體看裡面的實作,當changed為true時,說明音量值發生了變化,這時,會發送把值傳遞下去,同時去發消息去繪制UI,EXTRA_VOLUME_STREAM_VALUE為目前值的消息,EXTRA_PREV_VOLUME_STREAM_VALUE為調節前值的消息,EXTRA_VOLUME_STREAM_TYPE_ALIAS為流類型的消息。

是以查找EXTRA_VOLUME_STREAM_VALUE關鍵字,發現packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java中

rk3328_音量調節大小音量條不顯示

有調用,因為是音量條不顯示,肯定跟UI有關系,SystemUI嫌疑最大。

添加列印(在不清楚代碼流程的情況下,多添加列印對了解代碼流程有很大的幫助)。

rk3328_音量調節大小音量條不顯示

這裡的changed為true,會調用函數末尾的

rk3328_音量調節大小音量條不顯示

然後調用

rk3328_音量調節大小音量條不顯示

啟動線程,這裡的

rk3328_音量調節大小音量條不顯示

發現entrySet()的構造實作如下

rk3328_音量調節大小音量條不顯示

看來關鍵還是W這個類,進入W類,柳暗花明,發現了發消息的函數

rk3328_音量調節大小音量條不顯示

加log發現進入了onVolumeChangedW() case,發現ShouldshowUI(flags),望文生義,很顯然了吧

rk3328_音量調節大小音量條不顯示

對比了8.0的代碼

rk3328_音量調節大小音量條不顯示

我曹,差别這麼大,8.1的實作更複雜,判斷更多。通過與管理sdk的商議,加上box的政策,完美解決!!!!

rk3328_音量調節大小音量條不顯示

總結:遇到問題,以後多加log資訊,這點相信程式員都是懂知道;遇到瓶頸時多問老前輩,有時候可能查找方向都是錯的,會多做很多無用功。