AccessibilityService+WindowManager+SurfaceView开系统权限
一种通过自动获取用户权限增强产品体验的方法
本文是基于辅助功能+悬浮窗+SurfaceView来实现自动获取用户权限的具体方案设计与实现。辅助功能抢红包插件相信大家并不陌生,但是微信官方不允许,但是在工具软件领域还是可以大显身手,特别是开权限。辅助功能的作用就是实现节点查找和模拟点击,而悬浮窗实现需要的蒙层遮罩效果,SurfaceView则是实现流程的过渡动画。
1、 什么是辅助功能
辅助功能其实是一个Android系统提供给的一种服务,本身是继承Service类的。这个服务提供了增强的用户界面,旨在帮助残障人士或者可能暂时无法与设备充分交互的人们。
许多Android用户有不同的需求,要求它们以不同的方式与他们的Android设备进行交互。这包括用户视觉、物理或年龄限制,防止他们完全看到或使用触摸屏,和用户与听力损失可能无法感知声音和警报信息。 Android提供了辅助功能服务更容易帮助这些用户导航设备,包括语音、触觉反馈、手势导航,轨迹球和directional-pad导航。Android应用程序开发人员可以利用这些服务使应用程序更容易。 Android开发者也可以建立自己的辅助功能服务,可以提供增强的可用性特性,比如音频提示物理反馈和替代导航模式。辅助功能服务可以为所有应用程序提供这些增强功能,一组应用程序或只是一个单一的应用程序。
本文正是利用辅助功能服务提供的这些增强功能,实现在Android设备权限界面上查找到我们需要的节点信息,然后进行模拟点击。整个点击过程通过一个悬浮窗蒙层遮住,在悬浮窗上面通过SurfaceView实现一个不抢占和阻塞UI线程的一个过渡动画来与用户进行交互。
2、 整体方案流程
2.1. 整体功能流程图
图2-1 整体方案流程图
2.2. 权限数据管理流程
图2-2 数据管理流程图
3、 功能框架设计与实现
3.1. 框架模块设计
整个框架可分为辅助功能服务模块,权限数据控制模块,界面控制模块。辅助功能服务模块主要负责接收并筛选辅助功能回调事件,查找页面节点,并实现模拟点击。权限数据控制模块,主要负责控制云端库文件的下拉更新以及权限库文件的解析。界面控制模块主要控制整体权限开启流程,开启前的引导,开启过程中的蒙层上流畅的过渡动画,以及开启成功或失败后的状态提示。整体功能模块图3-1如下所示,整体框架图如图3-2所示。
3-1 整体功能模块图
图3-2 整体框架图
下面依次从辅助功能服务模块,权限数据控制模块,界面控制模块来描述具体的实现。
3.2. 辅助功能模块实现原理
自定义一个服务类AccessibilitySampleService(这个命名可以随意),继承系统的AccessibilityService并覆写onAccessibilityEvent和onInterrupt方法。编写好服务类之后,在系统配置文件(AndroidManifest.xml)中注册服务。完成前面两个步骤就完成了基本发辅助功能服务注册与配置,具体的功能实现需要在onAccessibilityEvent中完成,根据onAccessibilityEvent回调方法传递过来的AccessibilityEvent对象可以对事件进行过滤,结合AccessibilitySampleService本身提供的查找节点与模拟点击相关的接口即可实现权限节点的查找与点击。
辅助功能服务类实现
辅助功能服务注册与配置
在工程res目录下新建xml文件夹,新增accessibility_config.xml配置文件,内容如下:
在AndroidManifest中配置辅助功能服务
实现节点查找(这里是按文本进行查找,没有用View的ID)并点击
获取根节点
实现模拟点击
3.3. 权限数据控制模块实现原理
此模块逻辑比较独立,重点是权限库文件的设计与解析,库文件包括的内容就是每个机型的各个权限所以的页面的基本信息,比如权限的ID,权限名称,权限开启子步骤,权限所在页面路径等。库文件使用json文件格式描述,便于解析与维护。
权限库文件设计好之后,需要做云端更新,便于能做快速适配,及时修复问题。云端更新时需要设置好版本控制,设置好库文件的更新机制,比如是一天更新一次,还是每次使用功能时都检测是否需要更新,控制对本地库文件的覆盖机制,避免将错误的数据替换掉本地正确的数据。另外要规定好本地库文件的路径,方便程序对其进行解析。
单个权限节点配置信息如下:
delay_time属性代表点击前的等待加载时间,type_id是权限对应的id(这是自定义的),describe属性是对权限的一个描述(方便库文件的阅读而已),intent属性代表这个权限所在的包名跟具体的类名(这是最重要的,跳转就靠这个属性),step代码开启这个权限所需的步骤,find_node属性表示要在这个页面查找什么节点。至于库文件的设计格式这个依赖于程序的设计,可以不一样,只要知道原理即可。
3.4. 界面控制控制模块实现原理
界面控制模块主要是控制整体流程的交互,为了避免让用户看到开启权限的过程,需要使用Android的悬浮窗,在启动开启权限流程之后,实现一个悬浮窗覆盖在最顶层。并且在悬浮窗蒙层上面提供当前的进度与提示,告诉用户当前在做什么,做了多少。
在开启权限的过程中,所有的操作几乎都是在UI线程里面工作的,所以蒙层上如果用普通的动画方式实现的话,是会卡顿的,影响用户体验。所以在本发明中,使用了非阻塞UI线程的方式实现,那就是使用自定义SurfaceView实现自定义动画。因为SurfaceView的绘制在单独的绘制线程里面执行的,不会抢占UI线程的资源,不会对权限开启流程造成任何负面影响,反而减少了开启权限所需要的整体时间。另外在SurfaceView中实现流畅的过渡动画,减少用户等待时间,一直与用户有交互,增强用户体验。
悬浮窗蒙层上实现的动画效果如下所示:
4、 总结
本方法使用辅助功能自动开启权限,提供了可配置式的权限开启列表,具有很强的拓展性和可维护性,开启过程使用悬浮窗蒙层遮盖使得用户无需担忧,并且在蒙层上使用流畅的过渡动画和提示与用户进行友好交互,提升了产品体验,不再卡顿,不再有漫长的等待。这样能够减少因误触导致权限开启流程被中断的情况,同时能够提升用户的权限开启率和权限的开启成功率,从而提升软件的功能活跃,提升功能留存。
辅助功能Sample地址
本文中的所说的方案完整源码涉及公司信息安全,所以并没有提供。下面提供一个辅助功能基本使用的项目地址,后面也会抽离一部分代码加进去。
https://github.com/PopFisher/AccessibilitySample
AccessibilityService+WindowManager+SurfaceView开系统权限的更多相关文章
- iOS - 系统权限(关键时刻很有用的)
iOS开发中权限问题: APP开发避免不开系统权限的问题,如何在APP以更加友好的方式向用户展示系统权限,似乎也是开发过程中值得深思的一件事: 那如何提高APP获取iOS系统权限的通过率呢?有以下几种 ...
- OA系统权限管理设计(转载)
不论什么系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统加入亮点. l 不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是 ...
- Android开发之深入理解Android 7.0系统权限更改相关文档
http://www.cnblogs.com/dazhao/p/6547811.html 摘要: Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限 ...
- m_Orchestrate learning system---mo系统权限思考
m_Orchestrate learning system---mo系统权限思考 一.总结 一句话总结:注意不同身份访问同一客户端时候的权限,比如面板显示,比如功能按钮 权限 面板 功能 1.小组之间 ...
- MTK Android 如何获取系统权限
Android如何获得系统(system)权限 Android中如何修改系统时间(应用程序获得系统权限) 在 android 的API中有提供 SystemClock.setCurrentTimeMi ...
- 解析大型.NET ERP系统 权限模块设计与实现
权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...
- Oracle 用户、角色、权限(系统权限、对象权限)的数据字典表
1 三者的字典表 1.1 用户 select * from dba_users; select * from all_users; select * from user_users; 1.2 角色 s ...
- Oracle sys和system用户、sysdba 和sysoper系统权限、sysdba和dba角色的区别
sys和system用户区别 1)最重要的区别,存储的数据的重要性不同 sys所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己 ...
- Android如何通过shareduserid获取系统权限
[原文] android会为每个apk进程分配一个单独的空间(比如只能访问/data/data/自己包名下面的文件),一般情况下apk之间是禁止相互访问数据的.通过Shared User id,拥有同 ...
随机推荐
- ESL翻译:Linear Methods for Regression
chapter 3: Linear Methods for Regression 第3章:回归的线性方法 3.1 Introduction A linear regression model assu ...
- Oracle安装步骤
1.在Oracle官网下载安装包: 2.非常重要:两个压缩包都要解压(不是分卷压缩的,不然安装过程中会报找不到文件的错误,被坑过!): 3.关闭所有安全相关软件(关闭杀毒软件.防火墙.windows ...
- 【二十四】使用mysqli扩展类批量执行多条sql语句
批量处理多个sql语句 <?php //批量执行多个dml语句 // $mysqli=new mysqli("localhost","root",&quo ...
- HTML基础教程-元素
HTML 元素 HTML 文档是由 HTML 元素定义的. HTML 元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签 ...
- iOS Swift 模块练习/swift基础学习
SWIFT项目练习 SWIFT项目练习2 iOS Swift基础知识代码 推荐:Swift学习使用知识代码软件 0.swift中的宏定义(使用方法代替宏) 一.视图 +控件 1.UIImag ...
- HTTP协议------->资源和URL
1.前言 最近在研究http,希望结合书本,对网上资料进行整合,用“人话”聊聊这个玩意儿- 计划用近十篇文章,详尽的说清楚以下一些问题: URL和资源.HTTP报文是什么东西? HTTP是怎样进行链接 ...
- Noip2016换教室(期望+DP)
Description 题目链接:Luogu Solution 这题结合了DP和概率与期望,其实只要稍微知道什么是期望就可以了, 状态的构造很关键,\(F[i][j][0/1]\)表示已经到第\(i\ ...
- 如果没有UX经验,如何创建个人UX作品集?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 一直以来,这是设计行业的悖论. 当今,许多活跃于我们用户体验行业的专业人士在开始个人职业生涯时都面临 ...
- bzoj 1835: [ZJOI2010]base 基站选址
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- lesson - 3 笔记 ls /alias /ldd /cd /pwd /环境变量 / 目录
一.ls 命令 作用:用来显示目录列表. 语法: ls (选项) (参数) 选项: -a: 显示所有档案以及目录(ls内定将档案或目录名称为“./..”的视为隐藏) -A: 显示除隐藏文件“./.. ...