很多地方用到懸浮窗口,但是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都做了限制