android WindowManager 應用內部懸浮窗口總結

很多地方用到懸浮窗口,但是android現在做了很多限制,禁止懸浮窗口的濫用,尤其是系統權限的窗口基本不予支持,以下是介紹應用內部懸浮窗口不需要任何系統權限的

1   顯示一個懸浮窗

//   wm = (WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
     wm = getWindowManager();
     wmParams = new WindowManager.LayoutParams();
//   wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
     wmParams.format= PixelFormat.TRANSPARENT;//設置圖片格式,效果爲背景透明

     wmParams.flags= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 
            		| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
            		| WindowManager.LayoutParams.FLAG_FULLSCREEN
            		| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;  //窗口被虛擬按鍵遮擋問題
            
     wmParams.gravity = Gravity.RIGHT|Gravity.BOTTOM;
            
     wmParams.x = (int)(6*Utils.getScreenDensity());
     wmParams.y = (int)(8*Utils.getScreenDensity());
     wmParams.width = (int)(FloatScanView.FLOATVIEW_W * Utils.getScreenDensity());  //初始化窗口大小爲設置按鈕大小
     wmParams.height = (int)((FloatScanView.FLOATVIEW_H + FloatScanView.h_bottom ) * Utils.getScreenDensity());

上面的第一行被屏蔽的代碼可以看到通過getSystemService(Context.WINDOW_SERVICE)拿到WindowManager,但是通過這種方式獲取WindowManager會導致小米手機等部分手機需要系統權限,而我們只是需要做一個應用內部的懸浮窗口,不需要設置任何相關權限,所以可以直接通過Activity下的getWindowManager();函數得到WindowManager,並且也不需要設置窗口類型type。

2   說到窗口類型 window.type,上面的應用窗口是不需要這個type設置

下面介紹常用的幾個系統級別的TYPE:

WindowManager.LayoutParams.TYPE_SYSTEM_PHONE: 而它是非應用窗口,需要系統權限

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT: 和TYPE_SYSTEM_PHONE類似,都要系統權限

WindowManager.LayoutParams.TYPE_SYSTEM_TOAST: 可以繞過系統權限檢查,但是API25以上直接禁止用戶使用TYPE_TOST創建懸浮窗,而且一些小米的系統修改WindowManager的代碼,導致該系統在這個type下不能顯示懸浮窗

 

參考文章https://www.imooc.com/article/38964

參考文章https://blog.csdn.net/forLittleBlue/article/details/59563755

總而言之就是不建議開發系統權限的窗口,android限制越來越嚴格,針對系統級別的後面的API都做了限制
 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章