教你如何在Android 6.0上创建系统悬浮窗
来源:互联网 发布:jdk 8u60 windows x86 编辑:程序博客网 时间:2024/06/08 02:43
转自郭林的微信公众号
今天周二,又该跟大家分享由我执笔的文章了。从之前我写的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 callingSettings.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上创建系统悬浮窗
- 教你如何在Android 6.0上创建系统悬浮窗
- 教你如何在Android 6.0上创建系统悬浮窗
- 如何在Android中创建一个悬浮的界面
- Android-系统悬浮窗
- 如何在你的系统上安装Jekyll(上)
- 如何在Android中实现悬浮Activity
- 如何在你的iPad上创建VPN
- [Window 小技巧] 教你如何在Windiws平台上创建以点(.)开头的文件名
- 神奇的魔法师——教你在手机上如何一键创建相册
- 神奇的魔法师——教你在手机上如何一键创建相册
- 在linux系统上如何创建samba账号?
- 如何在Android系统上修改系统默认的字体大小
- 教你如何在Mac系统下编译Android系统的源码
- android 7.1悬浮窗系统权限问题
- android登陆按钮悬浮在软键盘上
- 一步一步教你在 Android 里创建自己的账号系统(一)
- Android在悬浮窗快捷中心中实现设置系统亮度功能
- ucore-lab7
- 修改redmine 中姓名的显示格式(按中国人的习惯)
- List、Map、Set三个接口,存取元素时,各有什么特点?
- iOS_SourceTree忽略文件
- SqlServer语法整理
- 教你如何在Android 6.0上创建系统悬浮窗
- 3.3 内核源码目录结构
- POJ 1046 Color Me Less GCC编译
- Java基础——StringBuffer,StringBuilder使用,超市管理系统
- Android Dev Intro - glsl noise algorithms
- Tabbar的自定义
- 面试题 <丑数>(10)
- 【leetcode】String——Longest Valid Parentheses(32)
- oracle job 定时执行 存储过程