1、前言

网上关于Android辅助服务的使用方式已经非常丰富了,所以也不在乎再多我这一篇了:-D。有同学说这是重复造轮子,题主很同意,但反过来说,如果自己没有能力造出轮子,还对重复造轮子嗤之以鼻,那……,再者,题主认为,自己重复一遍别人的轮子,踩踩坑,要比只看别人的轮子在理解上深刻的多,再不济,记录下来权当笔记吧

2、实现步骤

1、自定义服务继承系统的AccessibilityService服务,重写必要方法

2、配置AndroidManiFest.xml,增加服务相关配置

3、在res下新建文件夹xml,新建xml文件,配置服务的相关配置,并在AndroidManifest.xml指定该配置文件(也可以在服务类的onServiceConnected中配置)

4、打包、安装apk,在“设置里”找到辅助服务并开启即可。

3、具体实现

1、自定义服务,必须实现的方法是onAccessibilityEvent(AccessibilityEvent event)和onInterrupt(),代码如下

  1. public class AccessibilityServiceTest extends AccessibilityService {
  2.  
  3. //可在此方法中配置服务的相关配置,代替配置文件的方式
  4. @Override
  5. protected void onServiceConnected() {
  6. super.onServiceConnected();
  7. Log.d("XLZH:", "OnServiceConnected");
  8. }
  9.  
  10. //监听事件类型,根据事件类型不同做不同的处理。事件类型较多,各位可以打印出来筛选出来自己要监听的事件类型
  11. @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
  12. @Override
  13. public void onAccessibilityEvent(AccessibilityEvent event) {
  14. Log.d("XLZH:", event.toString());
  15. int eventType = event.getEventType();
  16. switch (eventType) {
  17. case AccessibilityEvent.TYPE_VIEW_SCROLLED:
  18. //获取发生该事件的页面根view
  19. AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
  20. //根据id查找需要点击的节点,返回的是一个List
  21. List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId("com.tendcloud.demo:id/pager");
  22. //获取List的第一个节点,并打印该节点的child数目及类名
  23. AccessibilityNodeInfo contentNodeInfo = list.get(0);
  24. Log.d("XLZH size:", String.valueOf(contentNodeInfo.getChildCount()));
  25. Log.d("XLZH class: ", String.valueOf(contentNodeInfo.getClassName()));
  26.  
  27. //通过查找文本的方式获得节点
    if(contentNodeInfo.findAccessibilityNodeInfosByText("button_test1") != null){
  28. Log.d("XLZH :", "first page");
  29. }
  30. if(contentNodeInfo.findAccessibilityNodeInfosByText("button1") != null){
  31. Log.d("XLZH :", "second page");
  32. }
  33. if(contentNodeInfo.findAccessibilityNodeInfosByText("tvweb") != null){
  34. Log.d("XLZH :", "third page");
  35. }
  36. break;
  37. }
  38. }
  39.  
  40. @Override
  41. public void onInterrupt() {
  42.  
  43. }
  44. }

2、配置AndroidManiFest.xml。如下

  1. <service
  2. android:name=".AccessibilityServiceTest"
  3. android:label="AccessibilityServiceTest"
  4. <!--声明权限,而不是申请权限-->
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
  5. android:exported="false">
  6. <intent-filter>
  7. <action android:name="android.accessibilityservice.AccessibilityService" />
  8. </intent-filter>
  9. <!--配置服务服务配置文件路径-->
  10. <meta-data
  11. android:name="android.accessibilityservice"
  12. android:resource="@xml/accessibility_xml" />
  13. </service>

3、编写辅助服务的配置文件

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:description="@string/description" //在设置中显示的内容
  4. android:accessibilityEventTypes="typeAllMask" //监听事件的类型
  5. android:accessibilityFeedbackType="feedbackGeneric" //反馈的类型
  6. android:notificationTimeout="100" //设置超时时间
  7. android:accessibilityFlags="flagDefault" //配置flag
  8. android:canRetrieveWindowContent="true" //可以获取窗口上的对象的值
  9. android:packageNames="com.tendcloud.demo" /> //配置要监听的包名

4、其他

1、有个印象深刻的坑是在配置AndroidManifest.xml时,不是使用<user-permission ...>,而是要在Service里声明服务,即有BIND_ACCESSIBILITY_SERVICE的应用才能访问该服务,而不是该服务需要申请这个权限

2、本来想是否可以只要该Service,而不要Activity,经过查阅资料、亲自尝试,结果是……不行!

3、还有一个坑,至今没有解决。测试的目的apk界面, 如下

如代码所示,本来想通过查找控件确定当前是那个页面,测试结果发现当在第一个页面的时候,Child包括第二个页面中的控件,当在第二个页面的时候,Child包括第一个、第二、第三个页面中的控件,当在第三个页面的时候,Child包括第二个页面和第三个页面中的控件。

具体原因不明白,有大神可以测试并指导一下,谢谢。

测试对象apk

测试代码

Android AccessibilityService(辅助服务) 使用示例的更多相关文章

  1. android AccessibltyService 辅助服务

    1.使用Accessibility可以模拟手机点击,获取屏幕文字,通知消息等. 2.使用该类需新建一个AccessibilityService的子类,并在AndroidManifest.xml文件中注 ...

  2. 【Android】解析AccessibilityService(辅助服务)的使用

    辅助功能是Android系统提供的一种服务,派生自Service类.这个服务提供了增强的用户界面,目的是为了帮助残障人士.它一般提供了页面元素查找功能和元素点击功能. 通过辅助功能,开发者可以实现一些 ...

  3. Android客户端与服务端交互之登陆示例

    Android客户端与服务端交互之登陆示例 今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台 ...

  4. 注意android辅助服务事件不能用于保存

    本来希望把来自辅助服务的事件,像epoll那样暂存在队列进行调度,或者做成事件堆栈,从而将辅助服务事件加入到容器.但是一直不能达到预期的后果.最后才发现一个坑人的事实,辅助服务事件被释放(或者说重置) ...

  5. 最新详解android自动化无障碍服务accessibilityservice以及高版本问题_1_如何开启获得无障碍

    前言 无障碍服务accessibilityservice是什么 简单来说 无障碍服务就是一个为残障人士 尤其是视觉障碍人士提供的一个帮助服务.具体就是可以识别控件 文字 可以配合语音助手 操作和 使用 ...

  6. Android调用Web服务

    现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...

  7. android自定义倒计时控件示例

    这篇文章主要介绍了Android秒杀倒计时自定义TextView示例,大家参考使用吧 自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.co ...

  8. 专题合集:深入Android媒体存储服务

    Android 有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用.这里包含了数据库管理. ...

  9. Android Google AdMob 广告接入示例

    Android Google AdMob 广告接入示例 [TOC] 首先请大家放心,虽然 Google搜索等服务被qiang了,但是 广告服务国内还是可以用的,真是普天同庆啊~~~噗! 其实这篇文章也 ...

随机推荐

  1. SQL Server客户端工具到底使用的是哪个provider呢?

    SQL Server客户端工具到底使用的是哪个provider呢? 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2013/01/10/sql-server- ...

  2. 转:log4net使用详解

    说明:本程序演示如何利用log4net记录程序日志信息.log4net是一个功能著名的开源日志记录组件.利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括M ...

  3. 解决iPhone滑动时滑到另一个层级导致卡顿问题

    问题概览: 两个div都可以滑动时,会造成滑动顶层div时,底层div也会跟着滑动.如图示. 解决方法: 添加CSS即可. 代码如下 * { -webkit-overflow-scrolling: t ...

  4. Windows10下python3.5的sklearn库安装

    具体安装方法参考https://blog.csdn.net/HYDMonster/article/details/79766086 但是注意的是,http://www.lfd.uci.edu/~goh ...

  5. 使用JavaScript实现简单的小游戏-贪吃蛇

    最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ...

  6. 【Android自动化】unittest测试框架关于用例执行的几种方法

    # -*- coding:utf-8 -*- import unittest class test(unittest.TestCase): def setUp(self): print 'This i ...

  7. requirejs原理深究以及r.js和gulp的打包【转】

    转自:http://blog.csdn.net/why_fly/article/details/75088378 requirejs原理 requirejs的用法和原理分析:https://githu ...

  8. Oracle_spatial的常见错误与注意事项

    常见的错误 1.ORA-13226:没有空间索引接口将不被支持 当使用一个空间操作符时,如果没有使用空间索引导致该操作符不能被完成将会返回该错误.这可能会发生在当你使用的列上没有空间索引.或者优化器没 ...

  9. tomcat Win10 配置环境变量详解

    在Win10系统总该如何配偶之tomcat 环境变量?今天win10之家给大家带来了关于win10系统中配置tomcat环境的操作方法.在配置之前我们需要做以下几点: 步骤:安装和配置好了Java 的 ...

  10. Android--------TabLayout实现新闻客户端顶部导航栏

    APP市场中大多数新闻App都有导航菜单,导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面,今日头条, 网易新闻等. 随着版本迭代的更新, ...