Android AccessibilityService(辅助服务) 使用示例
1、前言
网上关于Android辅助服务的使用方式已经非常丰富了,所以也不在乎再多我这一篇了:-D。有同学说这是重复造轮子,题主很同意,但反过来说,如果自己没有能力造出轮子,还对重复造轮子嗤之以鼻,那……,再者,题主认为,自己重复一遍别人的轮子,踩踩坑,要比只看别人的轮子在理解上深刻的多,再不济,记录下来权当笔记吧
2、实现步骤
1、自定义服务继承系统的AccessibilityService服务,重写必要方法
2、配置AndroidManiFest.xml,增加服务相关配置
3、在res下新建文件夹xml,新建xml文件,配置服务的相关配置,并在AndroidManifest.xml指定该配置文件(也可以在服务类的onServiceConnected中配置)
4、打包、安装apk,在“设置里”找到辅助服务并开启即可。
3、具体实现
1、自定义服务,必须实现的方法是onAccessibilityEvent(AccessibilityEvent event)和onInterrupt(),代码如下
public class AccessibilityServiceTest extends AccessibilityService {
//可在此方法中配置服务的相关配置,代替配置文件的方式
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.d("XLZH:", "OnServiceConnected");
}
//监听事件类型,根据事件类型不同做不同的处理。事件类型较多,各位可以打印出来筛选出来自己要监听的事件类型
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Log.d("XLZH:", event.toString());
int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_SCROLLED:
//获取发生该事件的页面根view
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
//根据id查找需要点击的节点,返回的是一个List
List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId("com.tendcloud.demo:id/pager");
//获取List的第一个节点,并打印该节点的child数目及类名
AccessibilityNodeInfo contentNodeInfo = list.get(0);
Log.d("XLZH size:", String.valueOf(contentNodeInfo.getChildCount()));
Log.d("XLZH class: ", String.valueOf(contentNodeInfo.getClassName()));
//通过查找文本的方式获得节点
if(contentNodeInfo.findAccessibilityNodeInfosByText("button_test1") != null){
Log.d("XLZH :", "first page");
}
if(contentNodeInfo.findAccessibilityNodeInfosByText("button1") != null){
Log.d("XLZH :", "second page");
}
if(contentNodeInfo.findAccessibilityNodeInfosByText("tvweb") != null){
Log.d("XLZH :", "third page");
}
break;
}
}
@Override
public void onInterrupt() {
}
}
2、配置AndroidManiFest.xml。如下
<service
android:name=".AccessibilityServiceTest"
android:label="AccessibilityServiceTest"
<!--声明权限,而不是申请权限-->
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:exported="false">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<!--配置服务服务配置文件路径-->
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_xml" />
</service>
3、编写辅助服务的配置文件
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/description" //在设置中显示的内容
android:accessibilityEventTypes="typeAllMask" //监听事件的类型
android:accessibilityFeedbackType="feedbackGeneric" //反馈的类型
android:notificationTimeout="100" //设置超时时间
android:accessibilityFlags="flagDefault" //配置flag
android:canRetrieveWindowContent="true" //可以获取窗口上的对象的值
android:packageNames="com.tendcloud.demo" /> //配置要监听的包名
4、其他
1、有个印象深刻的坑是在配置AndroidManifest.xml时,不是使用<user-permission ...>,而是要在Service里声明服务,即有BIND_ACCESSIBILITY_SERVICE的应用才能访问该服务,而不是该服务需要申请这个权限
2、本来想是否可以只要该Service,而不要Activity,经过查阅资料、亲自尝试,结果是……不行!
3、还有一个坑,至今没有解决。测试的目的apk界面, 如下



如代码所示,本来想通过查找控件确定当前是那个页面,测试结果发现当在第一个页面的时候,Child包括第二个页面中的控件,当在第二个页面的时候,Child包括第一个、第二、第三个页面中的控件,当在第三个页面的时候,Child包括第二个页面和第三个页面中的控件。
具体原因不明白,有大神可以测试并指导一下,谢谢。
Android AccessibilityService(辅助服务) 使用示例的更多相关文章
- android AccessibltyService 辅助服务
1.使用Accessibility可以模拟手机点击,获取屏幕文字,通知消息等. 2.使用该类需新建一个AccessibilityService的子类,并在AndroidManifest.xml文件中注 ...
- 【Android】解析AccessibilityService(辅助服务)的使用
辅助功能是Android系统提供的一种服务,派生自Service类.这个服务提供了增强的用户界面,目的是为了帮助残障人士.它一般提供了页面元素查找功能和元素点击功能. 通过辅助功能,开发者可以实现一些 ...
- Android客户端与服务端交互之登陆示例
Android客户端与服务端交互之登陆示例 今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台 ...
- 注意android辅助服务事件不能用于保存
本来希望把来自辅助服务的事件,像epoll那样暂存在队列进行调度,或者做成事件堆栈,从而将辅助服务事件加入到容器.但是一直不能达到预期的后果.最后才发现一个坑人的事实,辅助服务事件被释放(或者说重置) ...
- 最新详解android自动化无障碍服务accessibilityservice以及高版本问题_1_如何开启获得无障碍
前言 无障碍服务accessibilityservice是什么 简单来说 无障碍服务就是一个为残障人士 尤其是视觉障碍人士提供的一个帮助服务.具体就是可以识别控件 文字 可以配合语音助手 操作和 使用 ...
- Android调用Web服务
现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...
- android自定义倒计时控件示例
这篇文章主要介绍了Android秒杀倒计时自定义TextView示例,大家参考使用吧 自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.co ...
- 专题合集:深入Android媒体存储服务
Android 有一套媒体存储服务,进程名是 android.process.media,主要负责把磁盘中的文件信息保存到数据库当中,供其他 APP 使用以及 MTP 模式使用.这里包含了数据库管理. ...
- Android Google AdMob 广告接入示例
Android Google AdMob 广告接入示例 [TOC] 首先请大家放心,虽然 Google搜索等服务被qiang了,但是 广告服务国内还是可以用的,真是普天同庆啊~~~噗! 其实这篇文章也 ...
随机推荐
- python自学——集合
#皇城根儿#集合:是无序的.不重复的:1.去重:2.关系测试#创建集合#创建数字集合number=set([1,3,5,7,9]) #数字型集合str_type=set(["im" ...
- 转:ASP.NET前台代码绑定后台变量方法总结
经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方 ...
- Huawei DHCP 全局配置与接口配置
网络拓扑图如下所示: 说明: 1.交换机Ge0/0/1口和Ge0/0/2口配置基于全局的DHCP: 2.交换机Ge0/0/3口配置基于端口的DHCP: 3.交换机上配置vlan 10 .vlan 20 ...
- Security Software Engineer
Security Software Engineer Are you excited to be part of the VR revolution and work on cutting edge ...
- Custom Voice 操作步骤
首先,准备数据 1.Unicode格式的Transcript 2wav格式语音数据,并打包 好,现在POSTMAN进行api测试. 先拿着订阅密钥(Subscription Key)获取令牌(Toke ...
- Hive 整合Hbase
摘要 Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询.同时也可以将hive表中的数据映射到Hbase中. 应用 ...
- Thinkpad T420 调节声音进度条显示
重装了系统,进度条没了. 1.安装热键驱动:http://think.lenovo.com.cn/support/driver/driversdownlist.aspx?yt=pt&categ ...
- CF838D Airplane Arrangements
传送门:https://www.luogu.org/problemnew/show/CF838D 这道题反正我自己想是毫无头绪,最后还是听了肖大佬的做法. 因为题中说乘客可以从前后门进来,所以我们可以 ...
- 记录一次elasticsearch-php工作过程
初始化 $hosts = array('192.168.30.41'); $this->client = \Elasticsearch\ClientBuilder::create()->s ...
- helm 部署
Helm 基本概念 Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现.共享和使用为Kubernetes构建的应用,它包含几个基本概念 Chart:一个 Helm 包,其中包含了 ...