zoukankan      html  css  js  c++  java
  • Accessibility辅助功能--一念天堂,一念地狱

    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结构

    涉及微信界面的类:

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

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

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

    相关控件ID:

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

    红包详情页返回按钮: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

  • 相关阅读:
    4.函数
    3.文件操作及编码解码补充
    2.列表字符串字典元组集合
    1.杂项三元运算及字符编码
    python-数据类型补充及文件处理操作
    python-day02数据类型-字符串和列表的操作
    python-day01
    DOM
    javascript基本
    CSS几个属性
  • 原文地址:https://www.cnblogs.com/happyhacking/p/6368888.html
Copyright © 2011-2022 走看看