Android Accessibility功能

简介

Android的Accessibility功能,可以监听我们手机的焦点,窗口变化,按钮点击等等,同时可以进行一定程度的自动触觉反馈,手势操作等等。
实现它的AccessibilityService需要在手机设置里面->辅助功能在这里面找到你自己实现的辅助类。

使用

1.android 开发者网站上有文章 Building Accessibility Services介绍
https://developer.android.com/guide/topics/ui/accessibility/services.html
2.或者CSDN有篇博客
http://blog.csdn.net/wyzxk888/article/details/9006881
3.或者github上有个Demo
https://github.com/AlvinScrp/AccessibilityDemo

AccessibilityNodeInfo

AccessibilityNodeInfo我觉得是整个监听的核心了。
通过onAccessibilityEvent(AccessibilityEvent event)回调,event.getSource()可以获取了发生了event的源节点AccessibilityNodeInfo。event的type不一样,nodeInfo也不尽相同。

下面列举了四种常见的EventType:

我们定义 AccessibilityNodeInfo sourceNode=event.getSource();

EventType类型

1.AccessibilityEvent.TYPE_VIEW_CLICKED

事件源:点击事件
sourceNode是发生点击的view。
sourceNode的className 可能就是”android.widget.Button”或者其他一切能点击的控件。

2.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED

事件源:跳转到新的页面,或者弹出了window,dialog等
sourceNode是新的页面的根节点,
node.ClassName 是新的Activity的类名,或者是AlertDialog,Window等等
我们的Demo中通过sourceNode.getChild(i)遍历,可以获取到所有子节点
需要注意的是大部分机型会可以查询到所有子view对应的节点,包括不可见的view,但是部分机型比如小米miUi,只返回可见view节点。
但是总的来说,只要可以查询到的节点都可以performAction的。

3.AccessibilityEvent.TYPE_VIEW_SCROLLED

事件源:点击事件
sourceNode是发生滚动的view
sourceNode是发生滚动的view的节点

4.TYPE_WINDOW_CONTENT_CHANGED

某个view的内容发生的变化
sourceNode是发生view的节点,比如说某个TextView发生了内容变化,都会返回这个type类型的event

AccessibilityDemo 几个好用的方法

https://github.com/AlvinScrp/AccessibilityDemo

getTypeName(int type)

将AccessibilityEvent.TYPE_VIEW_CLICKED等int值,对应成字符串
“TYPE_VIEW_CLICKED”.

cycleAllNode(AccessibilityNodeInfo source, int deep)

深度优先遍历节点,有兴趣的可以改造下,可以做成查找

AccessUtil.isAccessibilitySettingsOn(Context,Class)

查询你自定的Service有没有开启
参数:Context, Class(Accessibility Service Class)

几个Tips

其实NodeInfo反映的是对应View的信息。

AccessibilityNodeInfo.isClickable

除了Button之外,ListView,LinearLayout等等返回的都是true。并不是说非得有点击事件。

AccessibilityNodeInfo.isEnabled

当一个Button处于不可点状态时,isEnabled必然为false

AccessibilityService.getRootInActiveWindow()

可以返回页面的根节点,很好用

AccessibilityNodeInfo.findAccessibility

.findAccessibilityNodeInfosByText(String text)
.findAccessibilityNodeInfosByViewId(String viewId)
viewId :在Android Studio中开启Android Device Monitor,选择设备后点击Dump View Hierarchy for UI Automator便可以得到viewId,需要注意的是viewId是程序员写的,版本更新后,随时会变。

AccessibilityNodeInfo.performAction

ACTION_CLICK,
ACTION_SCROLL_FORWARD
…..
即模拟操作

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值