许多Android使用者因为各种情况导致他们要以不同的方式与手机交互。这包括了有些用户由于视力上,身体上,年龄上的问题致使他们不能看完整的屏幕或者使用触屏,也包括了无法很好接收到语音信息和提示的听力能力比较弱的用户。Android提供了Accessibility功能和服务帮助这些用户更加简单地操作设备,包括文字转语音,触觉反馈,手势操作,轨迹球和手柄操作。本文学习的是AccessibilityService(辅助服务)的使用。
类结构
public abstract class AccessibilityService extends Service
java.lang.Object
android.content.Context
android.content.ContextWrapper
android.app.Service
android.accessibilityservice.AccessibilityService
package com.example.accessibilityservice;
import android.accessibilityservice.AccessibilityService;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
public class MyAccessibilityService extends AccessibilityService {
private static final String TAG = "MyAccessibilityService";
@Override
protected void onServiceConnected() {
Log.i(TAG, "onServiceConnected");
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// TODO Auto-generated method stub
Log.i(TAG, " eventType " + event.getEventType());
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
Log.i(TAG, "onServiceConnected");
}
}
- onServiceConnected()-(可选)当应用成功连接到你的辅助性服务时,系统调用该方法。使用这个方法为你的辅助性服务做任何一次性设置的步骤,包括连接到用户反馈的系统服务,如音频管理器或设备振动器。一些初始化的操作放在这里面。设置-辅助功能-打开辅助功能服务-确定之后会调用该方法。本Demo初始化参数是设置在AndroidManifest.xml里面,所以这里只添加打印为了方便追踪。如果你想在运行时或者一次性调整你服务的配置,这是一个方便的位置,这种情况时调用setServiceInfo()。
- onAccessibilityEvent()-(必需)在用户操作的过程中,系统不断的发送sendAccessibiltyEvent(AccessibilityEvent event);然后通过onAccessibilityEvent()可以捕捉到该事件,当系统检测到一个匹配你辅助性服务过滤器中设置参数的AccessibilityEvent时,调用该方法。例如,当用户在一个应用程序中点击一个按钮或焦点放在用户界面控件上时,,你的辅助性性服务就可以提供反馈。这种情况下,系统就通过相关连的AccessibilityEvent调用这个方法,然后服务就可以解释和使用为用户提供的反馈了。这个方法在服务的生命周期中可能会被多次调用。
- onInterrupt()-(必需)打断获取事件的过程,当系统中断在你的服务中提供的反馈时调用该方法,通常是在响应用户的诸如移动焦点到不同的控件上的动作时,调用该方法。该方法在你服务的生命周期中被多次的调用。
- onUnbind()-(可选)当系统即将关闭当前辅助性服务时,调用该方法。使用这个方法来一次性关闭任何程序,包括释放用户反馈系统服务,如音频管理器或设备振动器。
2. AndroidManifest.xml配置文件
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.accessibilityservice" >
<uses-sdk android:minSdkVersion="18"
android:targetSdkVersion="22"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<service
android:name="com.example.accessibilityservice.MyAccessibilityService"
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>
</application>
</manifest>
和其他服务一样在AndroidManifest.xml中被声明但它必须被指定操纵“android.accessibilityservice.AccessibilityService”的意图
3. 其中的android:resource="@xml/accessible_service_config"配置
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/app_name"
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackAllMask"
android:packageNames="com.tencent.mm"
android:notificationTimeout="10"
android:accessibilityFlags=""
android:canRetrieveWindowContent="true"/>
这里需要提醒的是配置的时候packageNames这个就是你要监听的包名,这里我们需要监听的是安装的信息,所以包名就是com.tecent.mm,可以有多个用逗号隔开,accessibilityEventTypes这个是监听的事件。
如果AndroidManifest.xml中没有如上配置,则可以用java代码在onServiceConnected中动态设置这些参数。
因为本Demo没有界面,如果安装成功,不会启动界面,只会在设置-辅助功能 中看到有对应的服务,服务名就是AndroidManifest.xml中定义的app_name。
onAccessibilityEvent
这里面最重要的部分就是onAccessibilityEvent这个回调函数,当我们注册了监听事件的时候,当有事件发生就会通知我们这个函数,但是一定要注意这个函数通知是异步的,当然很多朋友就会问这个是怎么通知到这里来的呢?他是通过AccessibilityDelegate这个代理类,发送出来的,这个类有个方法sendAccessibilityEvent可以发送事件。那这个类又怎么和我们的窗口联系呢?这里举个例子。比如我们的View类里面有个setAccessibilityDelegate这个方法,是不是这下一切都明了了呢?然后就是调用我们的find函数去当前节点里面找到我们需要的节点信息,通过模拟点击事件来安装我们的软件,当然如果是输入框也是可以模拟输入的哦。
拓展:
在onAccessibilityEvent方法中调用 AccessibilityNodeInfo noteInfo = event.getSource()可以获得AccessibilityNodeInfo对象,进而可以做很多自动化相关的操作,比如批量安装功能、微信自动抢红包、自动化测试控件信息获取等辅助性服务。
参考资料 http://www.xuebuyuan.com/2061595.html
更多详细的可以参见官方文档,或者Android SDK的samples里的例子:ClockBackService, TaskBackService