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

一、悬浮窗

其实一开始,我是想当然的跟以前一样,开启一个全屏的透明的悬浮窗,进行遮罩的作用,但是发现,设置 Type 为 TYPE_TOAST 或者  TYPE_SYSTEM_ALERT 这样的悬浮窗某些类型的不同,会导致不单单把用户的操作屏蔽了,甚至窗口的一些状态改变也屏蔽的,导致辅助权限的 onAccessibilityEvent() 方法不回调,于是去找官方文档,查找相关悬浮窗的 Type 类型设置。然后被我找到这个属性值的 Type :LayoutParams.TYPE_ACCESSIBILITY_OVERLAY

我们再来看官方解释:Windows that are overlaid only by a connected AccessibilityService for interception of user interactions without changing the windows an accessibility service can introspect. In particular, an accessibility service can introspect only windows that a sighted user can interact with which is they can touch these windows or can type into these windows. For example, if there is a full screen accessibility overlay that is touchable, the windows below it will be introspectable by an accessibility service even though they are covered by a touchable window.

虽然官方写的一大堆,但是我们大概能 get 到里面的意思,其实就是设置为这个类型的悬浮窗,能够使辅助功能继续响应相关窗口与内容的变化。经测试,果然设置这个类型的悬浮窗,可以一方面屏蔽用户的触摸事件,另一方继续响应自动点击的相关操作。public void createFullScreenView(Context context) {

WindowManager windowManager = getWindowManager(context);        if (fullScreenView == null) {

fullScreenView = new FloatWindowFullScreenView(context);

LayoutParams fullScreenParams = new LayoutParams();            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {

fullScreenParams.type = LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;

} else {

fullScreenParams.type = LayoutParams.TYPE_TOAST;

}

fullScreenParams.format = PixelFormat.TRANSLUCENT;

fullScreenParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN

| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

| LayoutParams.FLAG_KEEP_SCREEN_ON

| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;

fullScreenParams.gravity = Gravity.CENTER;

windowManager.addView(fullScreenView, fullScreenParams);

}

}

值得注意的是,这个属性是在 android 5.1 之后加入进来,对于之前的版本,经测试,使用 Toast 类型,也能执行相关操作,至于为什么 5.1 之后不继续使用Toast类型呢,这里面涉及到悬浮窗的开启问题了,可自行百度悬浮窗的开启相关文章。

二、悬浮窗的 Context

我们一般开启悬浮窗的过程中,Context 的传递我们使用的 Service 或者 Activity,不过如果设置为 TYPE_ACCESSIBILITY_OVERLAY 的悬浮窗,是只能传入你继承自 AccessibilityService 的服务(Context,否则会报 Is Activity Running 这个异常,那如何在这个服务里面开启悬浮窗呢?我是使用广播的形式去开启的:// 注册广播接听者

IntentFilter filter = new IntentFilter();

filter.addAction(Const.ACTION_SHOW_COVER_VIEW);

filter.addAction(Const.ACTION_SHOW_SMALL_VIEW);

filter.addAction(Const.ACTION_SET_COVER_VIEW_TIPS);

registerReceiver(mReceiver, filter);

....省略其他代码

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

@Override        public void onReceive(Context context, Intent intent) {

String action = intent.getAction();            if (action.equals(Const.ACTION_SHOW_COVER_VIEW)) {                if (!FloatWindowManager.getInstance().isFullWindowShowing()) {

FloatWindowManager.getInstance().createFullScreenView(TaskService.this);

}

String toast = intent.getStringExtra(Const.EXTRA_WINDOW_TOAST);                if (!StringUtils.isEmpty(toast)) {

FloatWindowManager.getInstance().showToast(toast);

}

} else if (action.equals(Const.ACTION_SHOW_SMALL_VIEW)) {                if (!FloatWindowManager.getInstance().isSmallWindowShowing()) {

FloatWindowManager.getInstance().createSmallWindow(TaskService.this);

}

}else if (action.equals(Const.ACTION_SET_COVER_VIEW_TIPS)) {                if (FloatWindowManager.getInstance().isFullWindowShowing()) {

FloatWindowManager.getInstance().showTipst(intent.getStringExtra("tips"));

}

}

}

};

三、悬浮窗的实现

在悬浮窗的UI设计上,我们需要将其设置为透明背景,这样对用户是无感的,整个自动化流程中,其实是相当于屏幕有个用户看不到的“保护罩”在确保着你的自动化业务不被“打扰”。在布局上,我们需要实现最外层的根布局的点击事件,这样在用户点击屏幕的时候,弹窗 Toast 友好提示用户:自动化业务正在执行,请停止业务才能操作。

操作过程点击会弹出提示

同时悬浮窗提供“停止”按钮,可以终止业务并关闭全屏透明悬浮窗。

四、使用场景

部分软件需要开启许多权限才能保证软件的正常使用,例如市面上的某锁屏软件,他们需要涉及相当多的权限,如果一个个让用户去开启,可能找不到对应的权限怎么开启,于是他们把这个流程简化成脚本,只要用户开启辅助权限,则跳转到权限开启流程,自动到权限页面,把例如:开机自启动权限,读取通知,获取位置等权限开启。当然这个过程是被一个界面遮盖了的,用户是看不到执行了什么操作的(这也暴露android的安全性问题)。

某锁屏软件截图,侵权必删

作者:幕后眼光

链接:https://www.jianshu.com/p/ffa0641942a0

android浮标权限管理,Android辅助权限与悬浮窗相关推荐

  1. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据 ...

  3. java 二进制 归属权限_【Java EE 学习 75 上】【数据采集系统第七天】【二进制运算实现权限管理】【权限分析和设计】...

    一.权限计算相关分析 1.如何存储权限 首先说一下权限保存的问题,一个系统中最多有多少权限呢?一个大的系统中可能有成百上千个权限需要管理.怎么保存这么多的权限?首先,我们使用一个数字中的一位保存一种权 ...

  4. Yii2.0 后台UI框架以及权限管理扩展实现权限菜单管理

    Yii2.0 后台UI框架以及权限管理扩展实现权限菜单管理 一.安装后台框架ui 二.安装权限管理扩展 三.实现权限菜单管理 一.安装后台框架ui composer require dmstr/yii ...

  5. linux查询默认权限命令,Linux权限管理之基本权限

    Linux权限管理之基本权限 1.文件权限: -rw-r--r-- :         r 读   w 写     x 执行 -:   文件类型(- 文件  d 目录  l软链接文件)rw- r-- ...

  6. JAVAWEB开发之权限管理(一)——权限管理详解(权限管理原理以及方案)、不使用权限框架的原始授权方式详解

    知识清单 1.了解基于资源的权限管理方式 2. 掌握权限数据模型 3. 掌握基于url的权限管理(不使用Shiro权限框架的情况下实现权限管理) 4. shiro实现用户认证 5. shiro实现用户 ...

  7. android 优酷 自动全屏播放,Android如何实现仿优酷视频的悬浮窗播放效果

    Android如何实现仿优酷视频的悬浮窗播放效果 发布时间:2020-07-11 10:24:43 来源:亿速云 阅读:228 作者:清晨 这篇文章主要介绍Android如何实现仿优酷视频的悬浮窗播放 ...

  8. Android pms权限管理,Android权限机制

    为什么有权限机制 我们知道 Android 应用程序是沙箱隔离的,每个应用都有一个只有自己具有读写权限的专用数据目录.但是如果应用要访问别人的组件或者一些设备上全局可访问的资源,这时候权限机制就能系统 ...

  9. 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)

    前言:动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用.这些权限一般分为三种:(1)普通权限:直接man ...

最新文章

  1. eclipse生成java项目出错,Java项目使用了HttpClients相关包,用eclipse导出jar包就不能正常运行Error: A JNI error has occurred...
  2. 尝试去读SQLMAP源码(一)
  3. 西华大学计算机组成原理补考卷,浙江大学航空航天学院空天信息技术保研
  4. 大唐波斯将军 机器人_你的工作会被机器人取代吗? 作者:大唐波斯将军2015-04-08 09:34...
  5. unity导入素材时材质丢失素材变成粉红色的解决方法
  6. 2019年Java编程开发值得学习的10大技术
  7. js中解决函数中使用外部函数局部变量的问题(闭包问题)
  8. 响应式个人简历网页源代码
  9. 二十年经典港台电视剧回顾
  10. myscript 思路整理
  11. fleck 客户端_关于C#使用Fleck 的websocket问题
  12. 联网获取360数据,识别骚扰电话,java实现
  13. 应用案例 | 2011款保时捷卡宴3.0T车发动机怠速间歇性抖动
  14. 《华尔街》观后笔记7——阳光交易
  15. 记录自己学习尚硅谷javaweb2022版中遇到的一些问题
  16. 同样是IT行业,测试和开发薪资真有这么大差别?
  17. mc服务器音乐文件夹在哪,我的世界 自定义音乐添加方法 MC怎么自定义音乐
  18. Windows下RStudio的下载与安装教程
  19. 微信点击短链接直接跳转到支付宝领红包教程 附带例子
  20. APAP多图拼接代码配置运行总结

热门文章

  1. 2022年Redis最新面试题- Redis分布式锁
  2. word表格中长表格每页显示表头/取消表头显示
  3. 鸿蒙基于开源minix系统,鸿蒙系统的微内核是
  4. 谁说中文不能编程了?快看文言文大战东北话
  5. Pwn_1 快速入门 bluewhale
  6. AR ———正方形图片识别转换成一个标记
  7. iphone计算机增强,iPhone手机实用小技巧这么多,身为果粉的你可一定要知道!
  8. linux删除目录下文件的几种方法总结
  9. 20.CSS3 立体卡片展示特效
  10. sql面试题:面试常考的sql语句题汇总(面试SQL必考必看)