基于安卓7.0和AccessibilityService自动抢单软件的总结和心得

前言

这篇文章重点在于实现下拉和点击功能的思路,以及此次成功实现功能后的心得体会,其他方面的内容将简单描述,希望能对热爱开发一些实用性工具的开发者有所帮助。

开发环境准备

安卓开发环境Anstroid Studio和JDK,windows。

实现过程

  1. AccessibilityService类的介绍和使用,直接百度搜索即可。
  2. 在了解并注册了AccessibilityService服务类后,接下来的重点是在onAccessibilityEvent方法中实现具体的业务(例如我此次需要实现的抢单功能)。
  3. 在onAccessibilityEvent方法中,有个AccessibilityEvent类型的参数,该类可以获取当前变动的类型(如页面的改变)。由于我是通过打开应用触发下拉和点击的功能的,因此监听的是 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 这一事件类型。
  4. 接下来,我们可以通过findAccessibilityNodeInfosByText()方法获取当前应用界面上的UI节点,并通过该节点的performAction模拟点击效果。但是!难点就在于这里,这种获取节点的方法只限于普通的view(如TextView),但是对于WebView下的节点这种方法是获取不到的。
  5. 于是我在网上搜索了下,终于找到了一篇博客是关于如何使用AccessibilityService获取WebView内容的,网址:感谢作者繁星点点的分享。很感谢作者繁星点点的分享,这次写博客分享也是因为被他的分享精神所影响。
  6. OK,获取到WebView内容中的节点后,下一步是通过获取的节点进行点击事件的模拟。然而难点之二又来了!在WebView中的节点调用performAction方法模拟点击事件时,应用是没有反应的!
    于是,在网上搜索一番后,得到了几种模拟点击的方法,此处再把他们进行对比一番,方便大家进行选择。
    第一种是MotionEvent,但是需要获取到View对象并绑定,言外之意就是说,你只能在当前界面所属的应用程序内部获取View才能模拟。
    第二种是使用ADB SHELL,此方法在模拟器上亲测可用,但是实际在手机上运行需要ROOT权限,对手机安全性会有影响。
    第三种是Instrumentation,需要给予INJECT_EVENTS权限,但是始终会出现问题,详见此处
    第四种是使用GestureDescription,无需ROOT即可实现点击和滑动,但是需要安卓7.0以上,估计这一条件对于大家来说应该不成问题。
  7. 好了,获取WebView下的节点和模拟滑动这两个烫手芋头就已经解决了,其他的问题都不难解决。

心得

此次开发遇到的问题基本上是通过网上搜索相关案例得到解决的,在“山重水复疑无路”之后,通过网友们的热心分享,终于“柳暗花明又一村”了。因此,在开发完成后被他们的分享精神所影响,决定自己也写下博客,记录下比较困难的几个步骤,方便网友们后续在实现这些功能时,直接就可以获取到解决方法。