熟悉Android开发的都知道辅助功能服务 Accessibility service。他的作用有非常多。360豌豆荚等应用市场的非root自己主动安装。微信抢红包插件。盲人辅助程序等等功能都是靠它实现的。 网上关于AccessibilityService的阐述和使用方法已经非常多非常具体了。能翻墙且英文没问题就直接看官网:http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html这里介绍个模拟自己主动点击事件的流程。

附上demo: https://github.com/jackuhan/WeChatLuckyMoney

我们写一个继承自AccessibilityService的XXXService类。在manifest中注冊下

<service
android:name=".XXXService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data android:name="android.accessibilityservice"
android:resource="@xml/accessible_service_config"/>
</service>

这里注冊了响应AccessibilityService 的intent-filter,那么这个service能够在系统触发AccessibilityEvent的时候被回调到。这个时候你的service此时会响应全部应用的同类Event,假设想仅仅响应某个特殊应用就须要使用setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo),这个须要在

onServiceConnected() 的回调中设置。

@Override
public void onServiceConnected() {
info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_FOCUSED;
info.packageNames = new String[] {"com.example.android.myFirstApp", "com.example.android.mySecondApp"};
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
info.notificationTimeout = 100;
this.setServiceInfo(info);
}

在程序中推断有没有开启这个自己主动点击服务。

AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> accessibilityServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
for (AccessibilityServiceInfo info : accessibilityServices) {
if (info.getId().equals(getPackageName() + "/.XXXService")) {
//开启了服务
}
}

假设没有开启。那么打开系统设置页面,用户点击开启。

Intent mAccessibleIntent =  new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(mAccessibleIntent);

AccessibilityService有下面几个回调

public void onAccessibilityEvent(AccessibilityEvent event);
public void onInterrupt();
public void onServiceConnected();
public void init(int connectionId, IBinder windowToken);
public boolean onGesture(int gestureId);
public boolean onKeyEvent(KeyEvent event);

onServiceConnected ()方法是AccessibilityService声明周期的一部分。在系统成功与服务绑定后才被呼叫,假设用来设定AccessibilityServiceInfo.这种方法更为方便。

这里须要在onAccessibilityEvent的回调中得到AccessibilityEvent ,

通过AccessibilityEvent.getSource()方法可以从资源中获得窗体的内容和行为,AccessibilityNodeInfo。通过findAccessibilityNodeInfosByViewId()或者findAccessibilityNodeInfosByText()方法可以确定我们要点击的button;

,然后performAction  ACTION_CLICK就可以就完毕了点击名称为"Name"的控件的事件了。

onAccessibilityEvent(AccessibilityEvent event)  {
AccessibilityNodeInfo nodeInfo = event.getSource()
List<AccessibilityNodeInfo> fetchNodes = nodeInfo.findAccessibilityNodeInfosByText("Name");
AccessibilityNodeInfo openNode = fetchNodes.get(int i);
openNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

Android 4.0版本号中添加了一个新特性,就是可以用AccessibilityService来遍历View层级。并从产生Accessibility 事件的组件与它的父子组件中提取必要的信息。为了实现这个目的,你须要配置:android:canRetrieveWindowContent="true"。

同一时候Android 4.0版本号開始,可以使用XML文件来配置这类service。

格式例如以下所看到的:

<accessibility-service
android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
android:packageNames="com.example.android.myFirstApp, com.example.android.mySecondApp"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
android:canRetrieveWindowContent="true"
/>

假设你使用了xml配置service的方式。确保在manifest中声明 <meta-data>这个标签内容。指定该service保存在res/xml/serviceconfig.xml中,比如这样:

<service android:name=".MyAccessibilityService">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data android:name="android.accessibilityservice"
android:resource="@xml/serviceconfig" />
</service>

Accessibility辅助控制类的更多相关文章

  1. .net之工作流工程展示及代码分享(四)主控制类

    现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...

  2. PHP-权限控制类

    http://blog.csdn.net/painsonline/article/details/7183679 <?php /** * 权限控制类 */ class include_purvi ...

  3. 类型转换辅助工具类TypeCaseHelper

    package org.sakaiproject.util; import java.math.BigDecimal; import java.sql.Date; import java.sql.Ti ...

  4. python 通过元类控制类的创建

    一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...

  5. Day 5-8 自定义元类控制类的实例化行为

    __call__方法: 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类( ...

  6. 【HLSDK系列】服务端实体 edict_t 和 控制类

    我们来了解一下引擎是怎么管理实体的吧!我们这里就说说服务端的实体(edict_t) 服务端用 edict_t 这个结构体来保存一个实体,可以说一个 edict_t 就是一个 服务端实体,下文简称实体. ...

  7. PHP-权限控制类(转)

    <?php /** * 权限控制类 */ class include_purview { /** * 类的唯一实例 */ private static $instance; /** * 权限常量 ...

  8. scratch教程:学做控制类积木

    少儿编程中scratch很容易被小孩所接受,不管是从外观还是教程中,都符合少儿的兴趣,为此现在只要是开少儿编程课都会有scratch课程,今天娜娜姐小码王scratch培训机构就为大家分享,scrat ...

  9. java多线程(六)线程控制类

    1.   多线程控制类 为了保证多线程的三个特性,Java引入了很多线程控制机制,下面介绍其中常用的几种: l  ThreadLocal l  原子类 l  Lock类 l  Volatile关键字 ...

随机推荐

  1. HDU 5171

    这道题本来很水,以前做过一样的,斐波那契数列,用矩阵快速幂的方法求,本来很水,以前做过很多次,为毛做的时候没想到T_T #include <iostream> #include <c ...

  2. Android开发之配置adb工具的环境变量

    在Android开发中,adb是一个非常好用也非常使用的工具,可是使用的时候假设没有改动环境变量,每一次都须要输入全然路径非常麻烦.解决的方法是在环境变量中加入adb工具的路径. Windows平台 ...

  3. Android error--No implementation found for native Lcomd

    在利用NDK编译Cpp执行时,出现了No implementation found for native Lcom等错误,调试好久,才发现 XXX.h和XXX.cpp.在XXX.cpp里#includ ...

  4. 《AndroidStudio每日一贴》3.高速切换代码风格、配色方案和键盘

    <AndroidStudio每日一贴>3.高速切换代码风格.配色方案和键盘 高速切换代码风格.配色方案和键盘,使用快捷键: control + ~ 很多其它有用技巧请查看<Andro ...

  5. #定位系统性能瓶颈# perf

    perf是一个基于Linux 2.6+的调优工具,在liunx性能測量抽象出一套适应于各种不同CPU硬件的通用測量方法,其数据来源于比較新的linux内核提供的 perf_event 接口 系统事件: ...

  6. angularjs1-路由

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. WSL初体验

    Windows10 新增加了WSL子系统, 体验了一下感觉还不错...   开启对应的功能后, 在商店里选择安装Ubuntu就可以了. 迁移文件系统 WSL 的文件系统位于 C 盘,当安装的软件越来越 ...

  8. Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转

    原文地址:http://mp.weixin.qq.com/s/eXvoJew3bjFKzLLJpS0Otg 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...

  9. spring事务,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    在aop配置事务控制或注解式控制事务中,try...catch...会使事务失效,可在catch中抛出运行时异常throw new RuntimeException(e)或者手动回滚Transacti ...

  10. WPF向系统发送消息 并传递结构体

    场景 :需要开发一个通讯组件 流程为:界面-开启接收服务-通过发送组件发送信息到 其他客户端和服务端 接受服务接收其他客户端发送的消息 需要传递给对应组件或者界面 因此会出现类库重复引用问题.因为采用 ...