天天看點

浮窗系列之越過授權使用浮窗簡單的浮窗實作窗實作越過權限使用浮窗輸入法的限制

使用windowmanager.layoutparams.type_phone

或windowmanager.layoutparams.type_sys_alert窗體類型,然後在别忘了androidmanifest.xml檔案中申明權限,這是網上關于浮窗實作的文章千篇一律的做法,很多開發團隊也是這麼做的。然而在android 4.4( api 19 )以後,手機rom就可以把這個權限動态的交給使用者來選擇了,例如華為、小米、oppo等一些機型。例如在華為榮耀6上,關掉《九遊》app的浮窗權限,九遊的浮窗就顯示不了了。

浮窗系列之越過授權使用浮窗簡單的浮窗實作窗實作越過權限使用浮窗輸入法的限制

于是很多産品在浮窗功能環節就加入了授權引導(針對不同的機型提示引導使用者去授權),這樣的體驗很不友好。好在這些痛點我們是可以技術政策解決的。

《交易貓》app已經越過浮窗授權,正常使用浮窗功能。

浮窗系列之越過授權使用浮窗簡單的浮窗實作窗實作越過權限使用浮窗輸入法的限制

類型為type_phone、type_priority_phone、type_system_alert、type_system_error、type_system_error這些的視窗都是需要使用者授權的,類型為type_toast的不需要,然而在android 4.4 (api 19)以下type_toast是無法擷取焦點的,具體源碼分析過程可以參考文章:

浮窗系列之越過授權使用浮窗簡單的浮窗實作窗實作越過權限使用浮窗輸入法的限制

在4.4以上使用type_toast還是有些小小的限制,如果浮窗互動中需要輸入框,type_toast和type_phone兩種類型窗體對輸入法的處理還是有些差別。當我們的浮窗在橫屏環境中(浮窗下面的應用是橫屏的),輸入法預設是全屏的,我們可以通過設定文本屬性android:imeoptions=“flagnoextractui”來禁止輸入法的全屏,同時可以設定窗體屬性為adjustresize來适配調整浮窗位置防止輸入法蓋住輸入框。

浮窗系列之越過授權使用浮窗簡單的浮窗實作窗實作越過權限使用浮窗輸入法的限制

然而adjustresize這個屬性對type_toast類型的窗體是無效的,本人暫時沒找到對應的源碼佐證,如果你找到了請告訴我一下。是以如果你的浮窗互動中是需要輸入文字的,就不能使用半螢幕輸入法的體驗了。

浮窗系列之越過授權使用浮窗簡單的浮窗實作窗實作越過權限使用浮窗輸入法的限制

為了最大程度的優化體驗,我們使用浮窗的流程可以細化為:

浮窗系列之越過授權使用浮窗簡單的浮窗實作窗實作越過權限使用浮窗輸入法的限制

關于浮窗授權,我們可以使用一下方法來判斷是否授權:

繼續閱讀