教你如何在Android 6.0上創建系統懸浮窗

郭霖大神的文章:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650235949&idx=1&sn=0f7eded67f834d38b02f8872768cb68a&scene=0#wechat_redirect


今天周二,又該跟大家分享由我執筆的文章了。從之前我寫的deep links、通知欄微技巧這兩篇文章中,大家應該能明顯體會出什么叫短小精煉,但又很有技術價值的文章。后面我還會堅持分享這種類型的文章,盡量讓大家十分鐘內就可以讀完,并且還能有所收獲。




在Android上創建系統懸浮窗并不是什么新鮮技術,我人生第一篇博客就是寫的關于如何實現類似于360手機衛士懸浮窗的功能,大家有興趣的可以到 http://guolin.tech 去翻翻歷史。不過如果你將項目的targetSdkVersion指定成23或者更高,你會發現之前創建懸浮窗的方式在Android 6.0系統上是無法運行的。不信的話我們就來試試。


首先建立一個非常非常簡單的自定義View:

public class FloatView extends Button { ? ?public FloatView(Context context) {super(context);setBackgroundResource(R.drawable.logo);}
}

然后在程序中調用如下代碼就可以創建出系統懸浮窗了:

public void showFloatView() {WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);FloatView floatView = new FloatView(getApplicationContext());WindowManager.LayoutParams params = new WindowManager.LayoutParams();params.type = WindowManager.LayoutParams.TYPE_PHONE;params.format = PixelFormat.RGBA_8888;params.gravity = Gravity.LEFT | Gravity.TOP;params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;params.width = 150;params.height = 150;params.x = 0;params.y = 0;windowManager.addView(floatView, params);
}

上面的代碼簡單易懂,就不再進行解釋了,如果對這部分代碼還不理解的朋友請去參考我的歷史第一篇博文好好學習一下。


最后還需要在AndroidManifest.xml中添加一個權限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

沒錯,就是這么簡單,現在這段代碼就已經可以成功創建出一個系統懸浮窗了,不過是在Android 6.0系統之前。


如果我們在6.0系統中運行上述代碼(注意targetSdkVersion要指定顧23),程序就會直接崩潰,錯誤日志如下圖所示:




咦?報了個權限被拒絕的錯誤,可是我們已經在AndroidManifest.xml中申請權限了,并且SYSTEM_ALERT_WINDOW權限也不是危險權限,并不需要進行運行時權限申請。


那么為什么在6.0系統上就會崩潰呢,我們來查看一下官方文檔的描述吧:


Note: If the app targets API level 23 or higher, the app user must explicitly grant this permission to the app through a permission management screen. The app requests the user's approval by sending an intent with action ACTION_MANAGE_OVERLAY_PERMISSION. The app can check whether it has this authorization by calling Settings.canDrawOverlays().


能夠熟練閱讀各類英文文檔也是一門非常重要的技能。上面的描述大概意思就是說,如果我們的targetSdkVersion指定成了23或者更高,在使用SYSTEM_ALERT_WINDOW權限時,需要先調用Settings.canDrawOverlays()來判斷一下是否允許創建懸浮窗,如果允許的話就可以創建了,不允許的話還要發送一個action值為ACTION_MANAGE_OVERLAY_PERMISSION的Intent來讓用戶同意創建懸浮窗。


針對文檔的描述,我們需要將代碼改成下面這個樣子:

public void buttonClick(View view) {if (Build.VERSION.SDK_INT >= 23) {if (Settings.canDrawOverlays(context)) {showFloatView();} else {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);startActivity(intent);}} else {showFloatView();}
}

首先最外層先判斷當前的系統版本,如果低于6.0的話那就直接創建懸浮窗就可以了。當系統是6.0或者更高的時候,我們就使用剛才文檔中描述的流程來進行邏輯實現,現在運行一下代碼,效果如下圖所示:




可以看到,當第一次創建懸浮窗的時候,會先跳轉到一個系統設置界面,在這里我們選擇允許當前程序創建系統懸浮窗,然后下一次再點擊按鈕時就能成功創建出系統懸浮窗了。

轉載于:https://www.cnblogs.com/muyuge/p/6152121.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CC精品教程】任務三:CC刺像控點,提交空三,新建重建項目(三維格網、三維點云、DOM和DSM)

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 【CC精品教程】任務一:CC新建工程、添加照片、相機參數設置、選擇坐標系統 【CC精品教程】任務二:導入像控點、差分POS,空三平差權重設置,提交自由空三 主要任務是準確的刺像控點,提交空三,…

官宣.NET 7 預覽版5

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;12分鐘)今天我們發布了 .NET 7 預覽版 5。.NET 7 的這個預覽版包括對通用數學的改進&#xff0c;方便了 API 作者&#xff0c;使其更輕松&#xff0c;一個新的 ML.NET 文本分類 API&#xff0c;增加了最先進的深度學習…

[轉]Android產品研發(十九)

轉載請標明出處&#xff1a;一片楓葉的專欄 上一篇文章中我們講解了webview中問題集錦&#xff0c;講解了webview的性能優化、webview種入Cookie信息、activity退出的時候清除webview信息報錯、如何通過java代碼和js代碼相互交互、webview如何下載文件以及騰訊的X5瀏覽服務等知…

C語言試題八十九之實現插入排序算法

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 C語言實現現…

【CC精品教程】ContextCapture 10.17安裝教程(附CC10.17安裝包下載)

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) CC10.17相比之前的版本有了好的新的功能和優點,在傾斜攝影測量中有了更多的優勢,精度和運行速度有了很大的提升。本文講解CC的安裝,附CC10.17安裝包下載,是您航測傾斜攝影測量的入門必備。 文…

centos7 kickstart 使用小結

1、添加參數使網卡名稱變為eth 1bootloader --locationmbr --append"net.ifnames0 biosdevname0 rhgb quiet" 2、psize使用說明&#xff1a;修改vg PE16m 默認4m 支持256G磁盤&#xff0c;適當的調整pesize,可以更多的使用磁盤空間 1volgroup Vol1--pesize16384 pv.…

IOS-網絡(文件上傳)

1 //2 // ViewController.m3 // IOS_0206_文件上傳4 //5 // Created by ma c on 16/2/6.6 // Copyright © 2016年 博文科技. All rights reserved.7 //8 9 #import "ViewController.h"10 #define BWFileBoundary "----------BowenKeJi"11 #define…

mac SecureCRT設置

參考&#xff1a; http://www.2cto.com/os/201407/320292.html SecureCRT 設置 1&#xff09;每次登陸都要輸入密碼&#xff1a; Global Option -> General 取消&#xff1a;Use Keychain前面的勾 2&#xff09;Logon Actions Logon Actions很強大&#xff0c;和python里…

【微服務專題之】.Net6下集成消息隊列上-RabbitMQ

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請公眾號后臺留言 源碼;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注].Net中RabbitMQ的使用超清觀看視頻哦~官網鏈接RabbitMQ代碼演示-詳細見代碼注釋&#xff0c;操作看上文視…

[轉]總結:Apache/Tomcat/JBOSS/Jetty/Nginx區別 .

總結&#xff1a;Apache/Tomcat/JBOSS/Nginx區別 . 1、Apache是Web服務器&#xff0c;Tomcat是應用&#xff08;Java&#xff09;服務器。Tomcat在中小型系統和并發訪問用戶不是很多的場合下被普遍使用。Apache支持靜態頁&#xff0c;Tomcat支持動態的。 2、Jetty:Tomcat內核作…

華為云GaussDB,11.11讓企業無后顧之憂

每年11.11大促對于數據庫而言都是一場生死考驗&#xff0c;如何保障系統的穩定可靠&#xff0c;如何平穩度過業務流量洪峰期&#xff0c;如何高效擴容&#xff0c;成為每個參與活動客戶的一大痛點。本文將通過5個常見的大促問題及分析&#xff0c;看看華為云GaussDB是如何解決這…

【CC精品教程】ContextCapture(CC)集群處理環境部署圖文教程

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 鑒于CC其三維構建運算的本質,海量數據的解析運算會使用大量的計算機資源,而再好的單臺計算機也無法勝過多臺計算機的并行運算能力,故而借助局域網內多臺計算機設備進行三維構建運算,可以節省大…

Linux-PAM PAM-MySQL的總結

1、理論知識 1.1、PAM模塊 1.1.1、PAM的介紹 Pluggable Authentication Modules簡稱PAM&#xff0c;是一個微縮的可插入認證模塊&#xff08;PAM is an acronym for Pluggable Authentication Modules&#xff09; 1.1.2、PAM的結構 1)模塊層(PAM服務模塊) - PAM結構最底層 作用…

ubuntu下配置jdk(離線壓縮包方式)

2019獨角獸企業重金招聘Python工程師標準>>> 1&#xff0c;下載jdk壓縮包 2、解壓后得到名字為jdk1.7.0_21的文件夾&#xff0c;將其復制到 /usr/lib/jvm下&#xff08;需要新建jvm文件夾&#xff09;。3、配置jdk環境變量&#xff1a;在啟動終端并輸入 gedit /e…

【PhotoScan精品教程】PhotoScan簡介、安裝教程(附PhotoScan1.4.5安裝包下載)

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) PhotoScan在無人機航空攝影測量空三運算中,具有運行速度快、精度高等特點。PhotoScan空三運算的結果可以導入CC等進行模型構建。【PhotoScan精品教程】講解利用PhotoScan軟件進行航測內業空三運算…

利用JS腳本快速刪除百度網盤同一目錄下的不需要文件(可以參考這個方法刪除重復文件)

比如百度網盤某目錄下存有如下文件&#xff1a; 要求&#xff1a;將如上圖文件目錄下的文件&#xff0c;每個月只保留最后&#xff08;新&#xff09;一個&#xff08;根據文件名中包含的日期&#xff09;&#xff0c;其它刪除。 比如7月份有3個文件&#xff0c;只保留2019-07-…

vuepress build提示YAMLException: end of the stream or a document separator is expected at line 7, colu

1、問題 vuePress執行build操作的時候 vuepress build ~/my_blogs/docs/ 錯誤提示如下 YAMLException: end of the stream or a document separator is expected at line 7, column 9:features:^at generateError (/usr/lib/node_modules/vuepress/node_modules/js-yaml/lib…

依賴注入之針對不同類型變量的幾種注入方式

控制反轉(Inversion of Control)和依賴注入(Dependency Injection)講的都是一個概念,只不過是站在了不同的角度,所謂的依賴注入: 依賴注入&#xff08;DI&#xff09;是指在運行期&#xff0c;由外部容器動態地將依賴對象注入到組件中。當spring容器啟動后&#xff0c;spring容…

【本周六活動】.NET Day in China

點擊藍字關注我們編輯&#xff1a;Alan Wang排版&#xff1a;Rani Sun活動介紹去年11月&#xff0c;.NET 6 的發布&#xff0c;為我們帶來了 .NET 多平臺應用 UI&#xff08;.NET MAUI&#xff09;。就在前不久&#xff0c;.NET MAUI 已正式發布。未來&#xff0c;作為 .NET 7 …

【PhotoScan精品教程】任務一:新建工程、導入照片、設置坐標系、導入控制點(POS)、自由空三

《無人機航空攝影測量精品教程》合集目錄(Pix4d、CC、EPS、PhotoScan、Inpho) 【PhotoScan精品教程】任務一:新建工程、導入照片、設置坐標系、導入控制點(POS)、自由空三 【PhotoScan精品教程】任務二:刺像控點,平差,質量報告精度檢查,像控點POS權重調配 【PhotoScan…