0x00什么是Accessibility(辅助功能)

考虑到部分用户不能很好地使用Android设备,比如由于视力、身体、年龄方面的限制,造成阅读内容、触控操作、声音信息等方面的获取困难,Android提供了Accessibility特性和服务帮助用户更好地使用Android设备。

依据Android官方的详细介绍,开发者在增加视图属性如contentDescription等内容后,可以在不修改原有代码逻辑的情况下使用户体验得到优化,如预装在Android 设备上的屏幕阅读器TalkBack,在没有修改系统源码的情况下,满足了视力不足的用户使用Android设备的需求,TalkBack会使用语音反馈描述用户所执行的操作,以及告知用户收到的提醒和通知,可以帮助视力水平较低的用户顺利进行手机的触控、阅读内容的进行。

0x01如何使用Accessibility(辅助功能)

在项目中应用AccessibilityService的三个步骤:

①继承AccessibilibityService,实现onAccessibilityEvent()和onInterrupt()方法。

 

在onAccessibilityEvent()方法中,我们可以接收所监听的事件。

②新建配置文件

在res目录下新建xml文件夹,新建accessibility.xml文件,如下所示:

字段名

字段说明

android:packageNames

指明了自己的辅助服务关心哪些应用发出的事件,多个应用包名之间用逗号分隔,如果不填,则关注手机上所有应用发出的事件。例如我们现在要利用辅助点击做app的自动安装功能,那么只需要关注 com.android.packageinstaller这个包发出的事件。如果只关注微信发出的事件,则这里填com.tencent.mm。

android:accessibilityEventTypes

辅助服务关注的事件类型,例如TYPE_VIEW_FOCUSED,TYPE_WINDOW_STATE_CHANGED,TYPE_NOTIFICATION_STATE_CHANGED等等。如果只关心微信的通知栏,那么这个属性可以设置为TYPE_NOTIFICATION_STATE_CHANGED。

android:accessibilityFlags

辅助服务额外的flag信息。例如FLAG_REPORT_VIEW_IDS可以使回调的事件带上view的ID。

android:accessibilityFeedbackType

事件的反馈类型,例如声音反馈、触觉反馈、视觉反馈等。

android:notificationTimeout

两个同样类型的辅助事件发给辅助服务的最小时间间隔

android:canRetrieveWindowContent

是否可以获取窗口内容

③在AndroidMainifest中注册:

该service需要权限android.permission.BIND_ACCESSIBILITY_SERVICE和action:android.accessibilityservice.AccessibilityService,使用名为android.accessibilityservice的meta-data指定配置文件。

重要参数及方法:

①AccessibilityEvent:

TYPE_NOTIFICATION_STATE_CHANGED:通知栏状态变化

TYPE_VIEW_CLICKED:视图被点击

TYPE_WINDOW_CONTENT_CHANGED:窗口内容变化

TYPE_WINDOW_STATE_CHANGED:窗口状态变化

....

②AccessibilityService:

onServiceConnected() :可选。系统会在成功连接上你的服务的时候调用这个方法,在这个方法里你可以做一下初始化工作,例如设备的声音震动管理,也可以调用setServiceInfo()进行配置AccessibilityServiceInfo。

onAccessibilityEvent() :必须。通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置工作时设置的。

onInterrupt() :必须。这个在系统想要中断AccessibilityService返给的响应时会调用。在整个生命周期里会被调用多次。

onUnbind() :可选。在系统将要关闭这个AccessibilityService会被调用。在这个方法中进行一些释放资源的工作。

getRootInActiveWindow():获取当前活动窗口中的根节点。

performGlobalAction():执行全局动作,例如返回等操作。

...

③AccessibilityNodeInfo:

getParent():获取父节点。

getChild():获取子节点。

performAction():在节点上执行一个动作。

findAccessibilityNodeInfosByText():通过字符串查找节点元素。

findAccessibilityNodeInfosByViewId():通过视图id查找节点元素。

...

0x02 Accessibility(辅助功能)应用实例

AccessibilityService一般应用步骤

①分析操作的流程,拆解成单步可实现的过程;

②通过UIAutomator和adb shell dumpsys来查看对应的UI控件ID、文本或者是具体的Activity;

③通过逻辑组合进行代码编写;

④调试、兼容性处理。

实例1.免root自动安装

 

实例2.微信自动抢红包(仅供技术交流)

①流程拆分(通知栏触发)

第一步:当通知栏变化时,检测是否包含“[微信红包]”关键字,若包含,则触发这个通知消息包含的intent。

第二步:跳转到聊天页面(com.tencent.mm.ui.LauncherUI),根据关键字“领取红包”占到对应的view,模拟点击触发ACTION_CLICK点击事件。

第三步:跳转到开红包界面(com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI),根据开红包按钮的id:com.tencent.mm:id/bg7模拟点击触发ACTION_CLICK点击事件。

第四步:进入红包详情页面(com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI),

根据返回键的id:com.tencent.mm:id/gd模拟点击触发ACTION_CLICK点击事件。

 

②微信UI结构

涉及微信界面的类:

l 微信主界面或聊天界面 -- com.tencent.mm.ui.LauncherUI

l 开红包界-- com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI

l 红包详情 -- com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI

相关控件ID:

l “开”按钮:com.tencent.mm:id/bg7

l 红包详情页返回按钮:com.tencent.mm:id/gd

③具体代码实现:

(1)重写MyAccessibilityService中的onAccessibilityEvent方法,监听通知栏消息,判断消息中是否“[微信红包]”,若包含,则跳转到对应的聊天界面。

(2)onAccessibilityEvent方法中的第二个case,监听com.tencent.mm.ui.LauncherUI,com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI,com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI三个界面,分别进行点击最近收到的红包,拆红包,推出红包详情页面的操作。

(3)遍历所有节点,获取最近收到的红包,进行模拟点击。

(4)根据控件ID对相应的view进行模拟点击,领取红包。

0x03 延伸阅读

Android Accessibility 安全性研究报告

http://www.freebuf.com/articles/terminal/114045.html

0x04 参考

Building Accessibility Services

https://developer.android.com/guide/topics/ui/accessibility/services.html

AccessibilityService从入门到出轨

http://mp.weixin.qq.com/s/7L2ysyTlFR1Xz4tk73dxuA

管家在手,红包我有 —手机管家红包提醒原理揭秘

http://km.oa.com/group/16523/articles/show/256070?kmref=search&from_page=1&no=1

Accessibility辅助功能--一念天堂,一念地狱的更多相关文章

  1. 【转】Android-Accessibility(辅助功能/无障碍,自动安装APP)

    参考: http://www.infoq.com/cn/articles/android-accessibility-installing https://developer.android.com/ ...

  2. LunHui 的生命观

    LunHui 的生命观 来源 https://www.zhihu.com/question/346510295 作者:齐天大圣链接:https://www.zhihu.com/question/346 ...

  3. KaiWu 的体验

    KaiWu 的体验 来源 https://www.zhihu.com/question/28950444 >>>>>>>>>>>> ...

  4. linux环境c++开发:ubuntu12.04使用llvm3.4.2

    什么是 clang/llvm/libc++[1] clang 是最近几年(在大财主苹果的支持下)发展得非常好的 C 家族语言 (包括C/C++/Obj-C/Obj-C++) 编译器前端,所谓前端,就是 ...

  5. Python You-Get (送你一个免广告的视频和音乐网站 VIP)

    You-get可以在仅仅提供URL情况下就可以实现下载视频.图片.音乐等信息.也可以通过播放器在线观看视频或听音乐,重要的是再也不用烦恼弹出的广告了,如果你想观看视频,但又不想观看广告,并且你还想把视 ...

  6. 又一年NOIP后的一波总结

    (昨天正式考完了吧...先写一下现在的感受,出成绩以及后续继续更...) 按照国际惯例,还是先讲一下故事吧. Day(~,0] 大概是跟随者时间的推进,气氛越来越紧张吧. 平时好像大家和往常一样,日常 ...

  7. iOS - iOS 应用

    1.Xcode 项目属性 Product Name 软件名称.产品名称.项目名称 Organization Name 公司名称.组织名称 Organization Identifier 公司的唯一标识 ...

  8. B 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)

    最熟悉的陌生人 作者:张慧桥 枪与玫瑰 我看了一下聊天室的名单,哈哈哈,我不禁喜出望外:蝶恋花那丫头片子挂在线上呢,真是天助我也.初时的担心一扫而光,我精神抖擞地喝下一大口咖啡,猛抽了三口烟,现在的我 ...

  9. 你有没有试过“闭上眼”使用:京东、滴滴、QQ、支付宝?

    正在看这篇文章的同学,也许是幸运的. 互联网的发展,让我们的生活越来越便利,但这个“我们”,也许并不包括那些残障人士.正常人眼里来说再简单不过的页面操作,对于盲人来说都是不可攀越的高墙.换句话说,越行 ...

随机推荐

  1. 1、下载LInux版的tomcat6

    1.下载LInux版的tomcat6 http://mirror.bit.edu.cn/apache/tomcat/tomcat-6/v6.0.37/bin/apache-tomcat-6.0.37. ...

  2. Ubuntu安装MongoDB和PHP扩展

    MongoDB是一个可伸缩的,高性能的开源NoSQL 文档数据库.主要用C++开发完成.面向文档存储,全索引支持,可复制和高可用性,自动分片等特征.其在非关系型数据库中是功能最丰富,最像关系型数据库 ...

  3. FreeRTOS基础以及UIP之协程--C语言剑走偏锋

    在FreeRTOS中和UIP中,都使用到了一种C语言实现的多任务计数,专业的定义叫做协程(coroutine),顾名思义,这是一种协作的例程, 跟具有操作系统概念的线程不一样,协程是在用户空间利用程序 ...

  4. javascript DOM 学习总结 (1)

    摘自javascript DOM编程艺术 1.首先介绍DOM的三个字母的含义: 1.1  D 如果没有document(文档),DOM 也无从谈起,当创建了一个网页并把他加载到web浏览器中时,DOM ...

  5. javascript基础教程学习总结(1)

    摘自javascript基础教程 开始: 1.将脚本放在哪里: 1.1 放在html和<html>之间 范例: <!DOCTYPE html PUBLIC "-//W3C/ ...

  6. eclipse快速定位java对应的class

    当前设置值,只能定位class文件 设置eclipse External Tools Configurations... Program --> new New 创建viewclass.bat文 ...

  7. JQueryUI确认框 confirm

    $(function(){ $('#AlertMsg').dialog({ autoOpen: false, width: 300, modal: true, position: 'center', ...

  8. UVa 900 - Brick Wall Patterns

    题目大意:用1*2的砖头建n*2的墙,问有多少种不同的砖头排列方式?与斐波那契序列相似. #include <cstdio> #define MAXN 60 #define N 50 un ...

  9. UVa 750 - 8 Queens Chess Problem

    题目大意:八皇后问题,在一个8*8的棋盘上,放置8个皇后,使得任意两个皇后不在同一行上.不在同一列上.不在同一条对角线上,不过这道题预先给定了一个位置放置一个皇后,让你输出所有可能的答案. 经典的回溯 ...

  10. 获取IE浏览器关闭事件

    //关闭浏览器时才会触发此操作,刷新页面不执行 //n 检测鼠标相对于用户屏幕的水平位置 - 网页正文部分左:求出鼠标在当前窗口上的水平位置(参照:当前窗口右上角为0.0坐标) //m 网页正文全文宽 ...