郭霖大神的文章: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

教你如何在Android 6.0上创建系统悬浮窗相关推荐

  1. Android M及以上版本系统 悬浮窗权限 的解决方案

    Android M及以上版本系统 悬浮窗权限 的解决方案 Android的窗口体系中,WindowManager占有非常重要的地位,平时我们使用悬浮窗会遇到一些权限的问题. 当 Android工程在 ...

  2. Android窗口Window的创建(悬浮窗)

    创建悬浮窗以及基于无障碍服务的窗口 关于悬浮窗的创建 启动悬浮窗 关于前台服务 启动服务 无障碍窗口 知识点 参考链接 关于悬浮窗的创建 首先需要获取WindowManager WindowManag ...

  3. adb 判断imei,如何在Android 5.0上使用adb命令获取MEID和IMEI信息?

    The only command that I know that works on other versions is "adb shell dumpsys iphonesubinfo&q ...

  4. 解决unity 打包在Android 8.0上启动出现黑屏问题(Android权限弹窗问题)

    解决unity 打包在Android 8.0上启动出现黑屏问题 本文链接:https://blog.csdn.net/baidu_34248947/article/details/89377983 我 ...

  5. 计算机上mac怎么用,教你如何在Mac苹果电脑上用Office办公软件

    原标题:教你如何在Mac苹果电脑上用Office办公软件 [名称]:Office2019_v16.30 [大小]:1.47 GB [语言]:简体中文 [安装环境]: Mac OS10.12 或更高( ...

  6. Android 5.0 上 Failure [INSTALL_FAILED_DUPLICATE_PERMISSION的问题

    今天在新的Android 5.0上调试程序的时候,安装一个程序,出现了Failure [INSTALL_FAILED_DUPLICATE_PERMISSION]的错误,但是在以前的Android4.4 ...

  7. android日记 设计说明,基于Android的掌上校园系统的设计与实现毕业论文.doc

    中文题目:基于Android的掌上校园系统的设计与实现 外文题目:THE DESIGN AND IMPLEMENTATION OF A HANDHELD CAMPUS SYSTEM BASED ON ...

  8. 如何在Ubuntu 18.04上创建多节点MySQL集群

    翻译转载:https://www.digitalocean.com/community/tutorials/how-to-create-a-multi-node-mysql-cluster-on-ub ...

  9. 如何在Ubuntu 16.04上创建多节点MySQL集群(MySQL-Cluster)

    翻译转载:https://www.digitalocean.com/community/tutorials/how-to-create-a-multi-node-mysql-cluster-on-ub ...

最新文章

  1. LeetCode实战:合并两个有序数组
  2. 张亚勤:对于产业来讲,深度学习的黄金时代刚刚开始
  3. 旷视:深度学习框架开源
  4. C++ Primer 有感(类)
  5. Padding Oracle Attack填充提示攻击-渗透测试
  6. 解题报告——蓝桥 试题 基础练习 矩阵乘法——27行代码AC
  7. 两年了,你还是那个你 | 今日最佳
  8. hdu 7111-Remove
  9. Docker-compose 安装Minio 最新版本
  10. 1.7 编程基础之字符串 31 字符串p型编码 python
  11. 提高对邮件的认识,两类邮件都要重视!!(不光有和客户的邮件工作方面的,还有单位的邮件一些联系事项),还有要自己看清楚邮件的全部内容,不要丢三落四!!
  12. 5.2.1 标准原子类型
  13. mysql java 社工库_社工库源码 汇总 持续更新
  14. 如何在linux运行exe文件,在Deepin系统下直接运行exe文件的方法
  15. 【Java 微信公众号开发】① 介绍、测试号、接入
  16. PHP学习之字符串操作
  17. 粤嵌实习-linux下madplay播放器的下载和使用、线程的介绍和创建一个广告循环播放线程
  18. android 扫码枪 字符数少掉,BarTender条码字符数莫名变少是怎么回事?
  19. 计算机网络笔记1 计算机网络概述
  20. eNSP配置ospf——三台路由器

热门文章

  1. 执行git命令时提示秘钥权限太开放‘Permissions 0644 for ‘/Users/liuml/.ssh/id_rsa_tz‘ are too open.’
  2. jer中无html文件,index.html
  3. 微信10个实用技巧,值得收藏!
  4. 后端技术:盘点HashMap 的7种遍历方式
  5. 程序员难以攻克的十大难题
  6. 让 步( 写的太好了!)
  7. linux创建虚拟声卡,Pear BIOS 安装和配置指引
  8. python[进阶] 6.使用一等函数实现设计模式
  9. 幕后常驻嘉宾配音小姐姐的2021年度总结
  10. 如何移除项目中无用的 console.log 代码