Android开发中AccessibilityService的使用

AccessibilityService在官网上的介绍如下:

An accessibility service runs in the background and receives callbacks by the system when AccessibilityEvents are fired. Such events denote some state transition in the user interface, for example, the focus has changed, a button has been clicked, etc. Such a service can optionally request the capability for querying the content of the active window. Development of an accessibility service requires extending this class and implementing its abstract methods.

大致的意思是它是一个运行在后台的服务,并且能够接受到系统和用户之间的交互信息,如按钮的点击,焦点变化等,它的主要功能如下:

一、获取当前UI信息

二、监听event(用户的操作)

三、响应控件

我个人觉得以上三点其实和uiautomator非常像,一和三这两点其实就是一个脚本工具的基本功能了,当然,uiautomator的会简单而且容易上手,但AccessibilityService的速度也要比uiautomator,而且功能也更全,比如用AccessibilityService去写抢红包就会比uiautomator更合适。

好了,废话不多说,这篇先说说AccessibilityService的使用。

1、声明

需要在 AndroidManifest.xml 中声明一个Service, 但是需要配置intent-filter为android.accessibilityservice.AccessibilityService,还需要添加BIND_ACCESSIBILTY_SERVICE的权限

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <service  
  2.             android:name=".MyAccessibilityService"  
  3.             android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">  
  4.             <intent-filter>  
  5.                 <action android:name="android.accessibilityservice.AccessibilityService" />  
  6.             </intent-filter>  
  7.             <meta-data  
  8.                 android:name="android.accessibilityservice"  
  9.                 android:resource="@xml/accessibility" />  
  10.         </service>  

 

2、配置

用来指定辅助事件的类型,以及监听包名等。

有两种方式,一种是通过xml来指定,这种方式需要在Service中添加meta-data属性

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:accessibilityEventTypes="typeViewClicked|typeViewFocused"  
  4.     android:accessibilityFeedbackType="feedbackSpoken"  
  5.     android:canRetrieveWindowContent="true"  
  6.     android:notificationTimeout="100" />  

还有一种方式是通过setServiceInfo方法去配置,一般都会在onServiceConneted(在服务连接成功的时候调用)方法中去调用它。如:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="java">@Override  
  2.     protected void onServiceConnected() {  
  3.         Log.i(TAG, "config success!");  
  4.         AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();  
  5.         //指定包名  
  6.         accessibilityServiceInfo.packageNames = PACKAGES;  
  7.         //指定事件类型  
  8.         accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;  
  9.         accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;  
  10.         accessibilityServiceInfo.notificationTimeout = 1000;  
  11.         setServiceInfo(accessibilityServiceInfo);  
  12.     }  


 

3、编写辅助Service

 

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import android.accessibilityservice.AccessibilityService;  
  2. import android.accessibilityservice.AccessibilityServiceInfo;  
  3. import android.util.Log;  
  4. import android.view.accessibility.AccessibilityEvent;  
  5.   
  6. public class MyAccessibilityService extends AccessibilityService {  
  7.     private static final String TAG = MyAccessibilityService.class.getName();  
  8.     private String[] PACKAGES = {"com.android.mms"};  
  9.   
  10.     public MyAccessibilityService() {  
  11.     }  
  12.   
  13.     @Override  
  14.     protected void onServiceConnected() {  
  15.         Log.i(TAG, "config success!");  
  16.         AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo();  
  17.         //指定包名  
  18.         accessibilityServiceInfo.packageNames = PACKAGES;  
  19.         //指定事件类型  
  20.         accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;  
  21.         accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;  
  22.         accessibilityServiceInfo.notificationTimeout = 1000;  
  23.         setServiceInfo(accessibilityServiceInfo);  
  24.     }  
  25.   
  26.     @Override  
  27.     public void onAccessibilityEvent(AccessibilityEvent event) {  
  28.         int eventType = event.getEventType();  
  29.         String eventText = "";  
  30.         Log.i(TAG, "==============Start====================");  
  31.         switch (eventType) {  
  32.             case AccessibilityEvent.TYPE_VIEW_CLICKED:  
  33.                 eventText = "TYPE_VIEW_CLICKED";  
  34.                 break;  
  35.             case AccessibilityEvent.TYPE_VIEW_FOCUSED:  
  36.                 eventText = "TYPE_VIEW_FOCUSED";  
  37.                 break;  
  38.             case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED:  
  39.                 eventText = "TYPE_VIEW_LONG_CLICKED";  
  40.                 break;  
  41.             case AccessibilityEvent.TYPE_VIEW_SELECTED:  
  42.                 eventText = "TYPE_VIEW_SELECTED";  
  43.                 break;  
  44.             case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:  
  45.                 eventText = "TYPE_VIEW_TEXT_CHANGED";  
  46.                 break;  
  47.             case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:  
  48.                 eventText = "TYPE_WINDOW_STATE_CHANGED";  
  49.                 break;  
  50.             case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:  
  51.                 eventText = "TYPE_NOTIFICATION_STATE_CHANGED";  
  52.                 break;  
  53.             case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END:  
  54.                 eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_END";  
  55.                 break;  
  56.             case AccessibilityEvent.TYPE_ANNOUNCEMENT:  
  57.                 eventText = "TYPE_ANNOUNCEMENT";  
  58.                 break;  
  59.             case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START:  
  60.                 eventText = "TYPE_TOUCH_EXPLORATION_GESTURE_START";  
  61.                 break;  
  62.             case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER:  
  63.                 eventText = "TYPE_VIEW_HOVER_ENTER";  
  64.                 break;  
  65.             case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT:  
  66.                 eventText = "TYPE_VIEW_HOVER_EXIT";  
  67.                 break;  
  68.             case AccessibilityEvent.TYPE_VIEW_SCROLLED:  
  69.                 eventText = "TYPE_VIEW_SCROLLED";  
  70.                 break;  
  71.             case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED:  
  72.                 eventText = "TYPE_VIEW_TEXT_SELECTION_CHANGED";  
  73.                 break;  
  74.             case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:  
  75.                 eventText = "TYPE_WINDOW_CONTENT_CHANGED";  
  76.                 break;  
  77.         }  
  78.         eventText = eventText + ":" + eventType;  
  79.         Log.i(TAG, eventText);  
  80.         Log.i(TAG, "=============END=====================");  
  81.     }  
  82.   
  83.     @Override  
  84.     public void onInterrupt() {  
  85.   
  86.     }  
  87.   
  88.   
  89. }  


最后,在设置--辅助功能中 将对应的service开启即可,这个例子是用来监听信息应用的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值