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. PHP 删除非法UTF-8字符

    //reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? $some_ ...

  2. jquery全选框的实现

    函数实现的话: head里加入函数实现 <script language="javascript" type="text/javascript"> ...

  3. sublime C++ build system配置体验

    近期准备实习,于是终于步入了sublime的阵营,sublime确实性感. 在配置win7下C++编译运行集成环境的时候遇到点问题,于是接触了一下JSON格式,最后终于自己搞定了.. 参考文档:htt ...

  4. ICE BOX 配置,使用----第一篇

    一 理论部分 (1) 为什么要使用icebox? icebox server代替了通常的server. icebox是为了方便集中管理多个ice服务而建立的. 它通过使用icebox服务器,把ice服 ...

  5. JS中的事件大全

    一般事件  onClick            鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDblClick        鼠标双击事件 onMouseDown        鼠标上的按 ...

  6. Android获取手机屏幕宽高

    //如果是获取单位是像素,可以如下: Display display = getWindowManager().getDefaultDisplay(); Point size = new Point( ...

  7. November 11th 2016 Week 46th Friday

    Keep in mind that neither success nor failure is ever final. 无论成败,皆非定局. The final is not coming, but ...

  8. FZU 1062 洗牌问题

    首先有一个规律:当一个数字归位的时候,所有数字都会归位. 因此只需要模拟一个数字就可以了. #include<cstdio> #include<cstring> #includ ...

  9. 关于Android反编译

    详情查看:http://blog.csdn.net/ordinaryjoe/article/details/8626010

  10. 安卓canvas操作的总结

    2014.07.03 使用canvas绘图 需求:公司需要绘制波形图,类似数学上的正弦波,一条是参考值,一条是实际曲线 解决方法:采用canvas绘图.保存为图片,以供导出 这里提供一个学习的demo ...