Android懸浮框的適配問題

山有木xi發表於2020-12-20

近日在寫程式碼時,發現Android6.0及以下使用懸浮框會崩潰,最開始以為是許可權的問題,但是在查詢log時發現,報錯的地方其實

mWindowManager.addView(floatView, mLayoutParams);

而floatview是內部定義的View,專門處理事件攔截的父View,大致是不會有錯的,於是將目光放在LayoutParams上,LayoutParams實現的是WindowManager.LayoutParams(),WindowManager的addView是定義在介面ViewManager,同時WindowManager也是一個介面,那麼就應該是WindowManager.LayoutParams的type有誤

果不其然,在查閱資料後發現,我使用的是

mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

這個是Android8.0新出的一個特性,因為Android8.0以後,使用SYSTEM_ALERT_WINDOW 許可權的應用無法再使用以下視窗型別來在其他應用和系統視窗上方顯示提醒視窗:

  • TYPE_PHONE

  • TYPE_PRIORITY_PHONE

  • TYPE_SYSTEM_ALERT

  • TYPE_SYSTEM_OVERLAY

  • TYPE_SYSTEM_ERROR

在Android8.0以下我使用的是

mLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE

正是這個地方出了錯誤,因為一個在Android6.0以上被谷歌官方淘汰的一個type,但是其在Android5.0依然有效,且不會崩潰,那就是

mLayoutParams.type = WindowManager.LayoutParams.TYPE_TOAST


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2743758/,如需轉載,請註明出處,否則將追究法律責任。

相關文章