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. iOS之NSDictionary和NSArray以及NSMutableDictionary和NSMutableArray:将不再是问题

    字典的key就相当于数组的下标,怎样操作数组你就学会了怎样才做字典:来感受一把 需要注意的是读取文件的类型要集合.plist文件的rooty:否则将不能读入文件 // 1.全国省市:得到的是省和市 / ...

  2. javascript 函数的基础知识

    1. Why JavaScript functions always return a value? I'm taking a course in JavaScript programming, an ...

  3. Quick Cocos2dx 调试问题

    最近由于忙了一段时间,忙完了之后又迷茫了这么久,然后终于开始继续Quick-x的学习之路了. 然后遇到了一个比较棘手的问题. 虽然照着官方mvc的例子敲代码,但是还是不停的报错,报错的问题下次集结成一 ...

  4. 从url中提取参数名和参数值(转)

    在已知参数名的情况下,获取参数值,使用正则表达式能很容易做到.js的实现方法如下: function getValue(url, name) { var reg = new RegExp('(\\?| ...

  5. (中等) POJ 1703 Find them, Catch them,带权并查集。

    Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...

  6. js之动态加载等待图像地址汇总

    Ajax火啊,火到了居然Loading Icons都有很多人专门提供的地步.下面是我同事给我介绍的一些提供Ajax Activity Indicators的网站,共享给大家,以便让我们的Ajax应用具 ...

  7. 21、手把手教你Extjs5(二十一)模块Form的自定义的设计

    前面几节完成了模块Grid的自定义,模块Form自定义的过程和Grid的过程类似,但是要更复杂一些.先来设计一下要完成的总体目标. 1、可以有多个Form方案,对应于显示.新增.修改.审核.审批等功能 ...

  8. 在阿里云ECS(CentOS6.5)上安装jdk

    JDK安装 在安装前先确定服务器上没有安装过JDK 命令: java -version 结果: 查看所有java安装包 命令: yum -y list java* 结果: 选择安装所需要的JDK 命令 ...

  9. STM32 USB 问题汇总(转)

    源:STM32 USB 问题汇总 汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下 ...

  10. java web面试

    1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理. 原博http://blog.csdn.net/shuaishenkkk/article/d ...