实现添加悬浮窗的核心源码代码WindowManagerService#addWindow方法中有以下几个关键:

1.权限检查

mPolicy.checkAddPermission(attrs, appOp);

2.悬浮窗参数调整

mPolicy.adjustWindowParamsLw(win.mAttrs);

查看不同android版本的源码对比

结论:

android 4.4(api 19)之前使用TYPE_TOAST 可以显示,但是不能接收触摸事件和按键事件

mPolicy实际上是PhoneWindowManager。

对比checkAddPermission()方法变化结论:

android 4.3(api 18) 开始 TYPE_TOAST根本没有做权限检查, 直接break出去了, 最后返回WindowManagerGlobal.ADD_OKAY。这个就是使用TYPE_TOAST不需要权限显示悬浮窗的原因

//android 4.3_r2.1

public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) {

int type = attrs.type;

outAppOp[0] = AppOpsManager.OP_NONE;

if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW

|| type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {

return WindowManagerGlobal.ADD_OKAY;

}

String permission = null;

switch (type) {

case TYPE_TOAST:

// XXX right now the app process has complete control over

// this... should introduce a token to let the system

// monitor/control what they are doing.

break;

case TYPE_DREAM:

case TYPE_INPUT_METHOD:

case TYPE_WALLPAPER:

// The window manager will check these.

break;

case TYPE_PHONE:

case TYPE_PRIORITY_PHONE:

case TYPE_SYSTEM_ALERT:

case TYPE_SYSTEM_ERROR:

case TYPE_SYSTEM_OVERLAY:

permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;

outAppOp[0] = AppOpsManager.OP_SYSTEM_ALERT_WINDOW;

break;

default:

permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;

}

if (permission != null) {

if (mContext.checkCallingOrSelfPermission(permission)

!= PackageManager.PERMISSION_GRANTED) {

return WindowManagerGlobal.ADD_PERMISSION_DENIED;

}

}

return WindowManagerGlobal.ADD_OKAY;

}

//android 4.4_r1

public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) {

int type = attrs.type;

outAppOp[0] = AppOpsManager.OP_NONE;

if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW

|| type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) {

return WindowManagerGlobal.ADD_OKAY;

}

String permission = null;

switch (type) {

case TYPE_TOAST:

// XXX right now the app process has complete control over

// this... should introduce a token to let the system

// monitor/control what they are doing.

break;

case TYPE_DREAM:

case TYPE_INPUT_METHOD:

case TYPE_WALLPAPER:

case TYPE_PRIVATE_PRESENTATION:

// The window manager will check these.

break;

case TYPE_PHONE:

case TYPE_PRIORITY_PHONE:

case TYPE_SYSTEM_ALERT:

case TYPE_SYSTEM_ERROR:

case TYPE_SYSTEM_OVERLAY:

permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;

outAppOp[0] = AppOpsManager.OP_SYSTEM_ALERT_WINDOW;

break;

default:

permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;

}

if (permission != null) {

if (mContext.checkCallingOrSelfPermission(permission)

!= PackageManager.PERMISSION_GRANTED) {

return WindowManagerGlobal.ADD_PERMISSION_DENIED;

}

}

return WindowManagerGlobal.ADD_OKAY;

}

对比adjustWindowParamsLw()方法变化结论:

android 4.4(api 19) 之前的TYPE_TOAST不能接收触摸事件和按键事件

//android 4.3_r2.1

public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) {

switch (attrs.type) {

case TYPE_SYSTEM_OVERLAY:

case TYPE_SECURE_SYSTEM_OVERLAY:

case TYPE_TOAST:

// These types of windows can't receive input events.

attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

attrs.flags &= ~WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;

break;

}

}

//android 4.4_r1

public void adjustWindowParamsLw(WindowManager.LayoutParams attrs) {

switch (attrs.type) {

case TYPE_SYSTEM_OVERLAY:

case TYPE_SECURE_SYSTEM_OVERLAY:

// These types of windows can't receive input events.

attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

attrs.flags &= ~WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;

break;

}

}

android大小悬浮窗,悬浮窗不同android版本适配相关推荐

  1. Android模仿360动态悬浮窗,像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(下)...

    悬浮窗 在上一篇文章像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(上)中我粗粗的向大家介绍了WindowManager和WindowManager.LayoutParams ...

  2. Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方

    市面上常见的摄像头悬浮窗,如微信.手机QQ的视频通话功能,有如下特点: 整屏页面能切换到一个小的悬浮窗 悬浮窗能运行在其他app上方 悬浮窗能跳回整屏页面,并且悬浮窗消失 我们探讨过用CameraX打 ...

  3. Android 实现视频的悬浮窗

    Android 实现视频的悬浮窗 如微信视频或者斗鱼直播一样,在应用切换到后台后,手机桌面还可以显示一个可以移动的小窗口,播放正在播放的内容.利用的就是android里面的WindowManager, ...

  4. Android无需权限显示悬浮窗, 兼谈逆向分析app

    前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...

  5. 【Android】利用WindowsManager悬浮窗播放本地视频以及下载线上视频保存在本地

    基于目前又重新拾起了分屏的项目需求,对之前研究的分屏播放视频做了更深入的研究.在之前的基础上做了改进和用户优化上的处理,实现了原生的VideoView加载本地视频.并使用FileDownLoader下 ...

  6. Android 悬浮窗权限各机型各系统适配大全(总结)

    原文链接:点击打开链接 ======================================================================================== ...

  7. Android 悬浮窗权限各机型各系统适配大全

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...

  8. Android之仿IOS悬浮窗

    在一些场合里,我们使用悬浮窗会有很大的便利,比如IOS系统的悬浮窗,360或者其他手机卫士的悬浮窗等等. 本篇博客,我们创造出两个悬浮窗,通过点击小悬浮窗打开或者关闭大悬浮窗. 代码如下: 在这之前, ...

  9. Android 悬浮窗,绝对是目前相关悬浮窗开源库最完美的适配方案

    PerfectFloatWindow 项目地址:Alonsol/PerfectFloatWindow 简介: android 全局悬浮窗,目前已经适配华为,小米,vivo,oppo,一加,三星,魅族, ...

  10. android浮标权限管理,Android辅助权限与悬浮窗

    Android辅助权限与悬浮窗在执行自动化服务的流程中,我们其实并不希望被用户的操作中断流程,所以有什么方法在用户点击自动化操作的过程中,避免用户再次操作呢?那就是开启一个全局透明的悬浮窗,进行屏蔽触 ...

最新文章

  1. ReentrantLock+线程池+同步+线程锁
  2. python上机实验报告读取文件_Python程序设计实验报告:实验八 文件
  3. python下载文件保存_python 3.3 下载固定链接文件并保存的方法
  4. Node.js:get/post请求、全局对象、工具模块
  5. django rest-framework 1.序列化 一
  6. cmw500综合测试仪使用_高端示波器是德MSOX4154A示波器-产品使用操作说明书【二手示波器吧】...
  7. php中取出数组中指定的值,PHP除开数组中指定的值
  8. pip install 报错 Error: Cannot uninstall ‘pyparsing‘ 的解决方法
  9. Mina Protocol将主网候选版本发布时间延后一小时至3月17日8点
  10. 解决“/dev/mapper/centos-root 100%”满了
  11. 《21天学通C语言(第7版)》一2.4 小 结
  12. 前端在H5页面唤起微信支付(H5支付)
  13. oracle怎么表示当天零点,Oracle 取得当天0时0分0秒和23时59分59秒
  14. 【ITool】mybatis-generator-annotation
  15. 滴滴AI负责人叶杰平:你的每一次出行,都已有AI落地的助力
  16. 《web开发: Ajax 介绍》
  17. 论文阅读:Hit-Detector: Hierarchical Trinity Architecture Search for Object Detection
  18. thinkpad e540 8cd更换高分屏
  19. NYOJ 87-棋盘分割(记忆化搜索)
  20. Flutter 报错Mapping values are not allowed here. Did you miss a colon earlier?

热门文章

  1. 解决Maven项目导入时报的Error ... org.springframework.web.context.Contex错误
  2. ZYNQ linux环境下PS I2C配置OV5640
  3. ssm+JSP计算机毕业设计作业管理系统ctoc8【源码、程序、数据库、部署】
  4. VBA提高篇_18 VBA代码录制优化Select(tion)_表格合并Merge()_Cells()_Rows()_Columns()
  5. 这些掌握了,你才敢说自己懂VBA
  6. 头歌 软件测试项目综合实训 答案 有目录善用目录 持续更新
  7. 2022年学生面试不写商城项目那就让自己假设处于工作状态的环境去学习吧!
  8. MapReduce实例----单表关联
  9. 从图像处理到语音识别,25款数据科学家必知的深度学习开放数据集
  10. Android ui 透明度设置