一种通过自动获取用户权限增强产品体验的方法

  本文是基于辅助功能+悬浮窗+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中配置辅助功能服务

实现节点查找(这里是按文本进行查找,没有用ViewID)并点击

获取根节点

实现模拟点击

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开系统权限的更多相关文章

  1. iOS - 系统权限(关键时刻很有用的)

    iOS开发中权限问题: APP开发避免不开系统权限的问题,如何在APP以更加友好的方式向用户展示系统权限,似乎也是开发过程中值得深思的一件事: 那如何提高APP获取iOS系统权限的通过率呢?有以下几种 ...

  2. OA系统权限管理设计(转载)

    不论什么系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统加入亮点. l         不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是 ...

  3. Android开发之深入理解Android 7.0系统权限更改相关文档

    http://www.cnblogs.com/dazhao/p/6547811.html 摘要: Android 6.0之后的版本增加了运行时权限,应用程序在执行每个需要系统权限的功能时,需要添加权限 ...

  4. m_Orchestrate learning system---mo系统权限思考

    m_Orchestrate learning system---mo系统权限思考 一.总结 一句话总结:注意不同身份访问同一客户端时候的权限,比如面板显示,比如功能按钮 权限 面板 功能 1.小组之间 ...

  5. MTK Android 如何获取系统权限

    Android如何获得系统(system)权限 Android中如何修改系统时间(应用程序获得系统权限) 在 android 的API中有提供 SystemClock.setCurrentTimeMi ...

  6. 解析大型.NET ERP系统 权限模块设计与实现

    权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...

  7. Oracle 用户、角色、权限(系统权限、对象权限)的数据字典表

    1 三者的字典表 1.1 用户 select * from dba_users; select * from all_users; select * from user_users; 1.2 角色 s ...

  8. Oracle sys和system用户、sysdba 和sysoper系统权限、sysdba和dba角色的区别

    sys和system用户区别 1)最重要的区别,存储的数据的重要性不同 sys所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己 ...

  9. Android如何通过shareduserid获取系统权限

    [原文] android会为每个apk进程分配一个单独的空间(比如只能访问/data/data/自己包名下面的文件),一般情况下apk之间是禁止相互访问数据的.通过Shared User id,拥有同 ...

随机推荐

  1. springboot整合系列

    Spring Boot 系列 博客原文:http://blog.csdn.net/isea533/article/details/50412212 Spring Boot 入门 Spring Boot ...

  2. angular过滤器基本用法

    1.过滤器主要用于数据的筛选,可以直接在模板使用 语法: {{expression | filter}} {{expression | filter | filter2}} {{expression ...

  3. python for循环巧妙运用(迭代、列表生成式)

    200 ? "200px" : this.width)!important;} --> 介绍 我们可以通过for循环来迭代list.tuple.dict.set.字符串,di ...

  4. Winccflexable触摸屏的报警

    1.报警的分类 2.自定义报警分类 3.报警组成 4.Winccflexable中预定义的报警类别 5.报警的确认 6.WinccFlexable报警的显示 1)报警视图 2)报警窗口 3).报警指示 ...

  5. office------------word邮件合并(word2016版)

    虽然本人是学计算机的,但是office技能很一般,最近工作中用到了邮件合并这一功能,记录下来与大家分享. 我用到的邮件合并就是word中定好模板,从excel中批量导入数据,现实生活中,在录取通知书打 ...

  6. [置顶] echarts x轴文字显示不全(xAxis文字倾斜比较全面的3种做法值得推荐)

    echarts x轴标签文字过多导致显示不全 如图: 解决办法1:xAxis.axisLabel 属性 axisLabel的类型是object ,主要作用是:坐标轴刻度标签的相关设置.(当然yAxis ...

  7. bzoj 4345: [POI2016]Korale

    Description 有n个带标号的珠子,第i个珠子的价值为a[i].现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的价值和.现在给所有可能的项链排序,先按权值从小到大排 ...

  8. openstack操作之一 命令行

    在openstack环境中提供了多种操作虚拟机的方法,有最简单直接的dashborad界面,有不直观但高效的命令行,还有进阶版的postman调用openstack restfulapi和命令行中使用 ...

  9. linux下后台运行MATLAB

    原帖:http://sypeterli1.blog.163.com/blog/static/2283740492013101745824207/ 后台运行matlab脚本文件的方法:nohup     ...

  10. 关于HTTP协议头域详解

    HTTP1.1 请求头:消息头  Accept:text/html,image/*  告诉服务器,客户机支持的数据类型 Accept-Charset:ISO-8859-1  告诉服务器,客户机采用的编 ...