郭霖大神的文章: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或者更高的时候,我们就使用刚才文档中描述的流程来进行逻辑实现,现在运行一下代码,效果如下图所示:

可以看到,当第一次创建悬浮窗的时候,会先跳转到一个系统设置界面,在这里我们选择允许当前程序创建系统悬浮窗,然后下一次再点击按钮时就能成功创建出系统悬浮窗了。

教你如何在Android 6.0上创建系统悬浮窗的更多相关文章

  1. 【译】如何在 Android 5.0 上获取 SD卡 的读写权限

    因为最近项目需要,涉及到 SD卡 的读写操作,然而申请 <!-- 读写权限 --> <uses-permission android:name="android.permi ...

  2. 教你如何在 Android 使用多线程下载文件

    # 教你如何在 Android 使用多线程下载文件 前言 在 Android 日常开发中,我们会经常遇到下载文件需求,这里我们也可以用系统自带的 api DownloadManager 来解决这个问题 ...

  3. Step by Step!教你如何在k3s集群上使用Traefik 2.x

    本文来自边缘计算k3s社区 作者简介 Cello Spring,瑞士人.从电子起步,拥有电子工程学位.尔后开始关注计算机领域,在软件开发领域拥有多年的工作经验. Traefik是一个十分可靠的云原生动 ...

  4. Android Api 27 在 Android 8.0 上出现 Only fullscreen opaque activities can request orientation 的解决情况

    刚上班,没有业务开发,对 App 的 Api 由 26 升级到了 27, 结果在 Android 8.0 的设备上会出现 crash . Log 如下: java java.lang.IllegalS ...

  5. visual studio 2017 中默认无法开发 Android 8.0 及以上系统的解决方案

    一般默认比较旧有两个原因,系统版本过旧,Visual Studio 版本过旧. 第一步,将windows 更新到最新版,必须是windows 10 并且更新到最新. 第二步,将visual studi ...

  6. Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()

    解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...

  7. Android 5.0以上获取系统运行进程信息

    在Android 5.0以上系统,调用getRunningAppProcesses 方法返回的列表为空,这是因为谷歌考虑到安全原因,已经把这个方法移除掉了, 那以后要获取系统运行的后台进程这个方法用不 ...

  8. 如何在Linux的桌面上创建快捷方式或启动器

    如果在Linux桌面系统中你经常使用一个程序,你可能想去创建一个“桌面快捷方式”,以便于你在桌面只要点击一下快捷方式就可以启动它.虽然不少带有图形界面的程序会在安装时自动在桌面上创建快捷方式,还有一些 ...

  9. 如何在 Windows 和 Linux 上确定系统使用的是 MBR 分区还是 GPT 分区详细步骤!!!

    在 Windows 上检查系统使用的是 MBR 分区还是 GPT 分区 点击放大镜搜索输入disk 点击打开 进入之后,右键点击你想要检查分区方案的磁盘,在右键菜单里选择属性! 在属性窗口,切换到卷, ...

随机推荐

  1. 搭建ssm项目框架

    [声明]转载注明链接,源码联系公众号:aandb7获取 [此处组织名groupId:com.dayuanit,可替换公司域名:项目名artifactid:...] 此处第二个配置文件选择maven安装 ...

  2. html5之img标签

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. java中的内部类概念

    内部类和外部类可以互相访问私有属性 1.普通内部类实例化方式 外部类.内部类 对象 = new 外部类().new 内部类(); class Outer{//外部类 private String ms ...

  4. 第一章 搭建一个通用的.net core项目框架

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

  5. [LeetCode] Find K-th Smallest Pair Distance 找第K小的数对儿距离

    Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pai ...

  6. BAT 前端开发面试 —— 吐血总结

    更好阅读,请移步这里 聊之前 最近暑期实习招聘已经开始,个人目前参加了腾讯和阿里的内推及百度的实习生招聘,在此总结一下 一是备忘.总结提升,二是希望给大家一些参考 其他面试及基础相关可以参考其他博文: ...

  7. css清除浮动方法小结

    清除浮动其实主要解决的就是高度塌陷问题,具体在此不再赘述~~~那些年我们一起清除过的浮动(大佬博客,写的挺不错) 方法小结:1. 1)添加额外标签 这是在学校老师就告诉我们的 一种方法,通过在浮动元素 ...

  8. [POI 2006]OKR-Periods of Words

    Description 题库链接 定义 \(A\) 串为 \(B\) 串的循环串,当且仅当 \(A\) 是 \(B\) 的前缀(不包括 \(B\) 本身),且 \(B\) 为连续的 \(A\) 串拼接 ...

  9. bzoj1272 Gate Of Babylon

    [问题描述] [输入格式] [输出格式] [样例输入] 2 1 10 13 3 [样例输出] 12 [样例说明] [数据范围] 先容斥,考虑枚举哪些条件强制不满足,即直接选出b[i]+1件宝具 假设强 ...

  10. 四个常用的 Rewrite 使用范例

    一.防盗链功能只这四行就实现了防盗链,原理是利用REFERER判断网页来源,缺点是REFERER容易伪造. RewriteEngine On RewriteCond %{HTTP_REFERER} ! ...