简介
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
…..
即模拟操作