辅助功能服务是Android框架的一项功能,旨在为安装在Android设备上的应用程序提供替代的导航反馈给用户。 无障碍服务可以代表应用程序与用户进行通信,例如当用户将盘旋在屏幕的重要区域上时,将文本转换为语音或触觉反馈。
创建您的辅助功能服务
辅助服务可以与普通应用捆绑在一起,也可以作为独立的Android项目创建。 在这两种情况下,创建服务的步骤是相同的。 在你的项目中,创建一个扩展AccessibilityService
的类。
/**
* Created by xiaolong on 2017/6/6.
*/
public class MyAccessibilityService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
}
@Override
public void onInterrupt() {
}
}
像任何其他服务一样,您也可以在清单文件中声明它。 记住要指定它处理android.accessibilityservice意图,以便在应用程序触发AccessibilityEvent
时调用该服务。
<service android:name=".MyAccessibilityService">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
</service>
如果您为此服务创建了一个新项目,并且不打算提供应用程序,则可以从源代码中删除启动器Activity类(通常称为MainActivity.java)。 记住还要从清单中删除相应的活动元素。
配置您的辅助功能服务
设置辅助功能服务的配置变量会告诉系统您希望运行的方式和时间。 您想要回应哪些事件类型? 服务应该对所有应用程序有效,还是只有特定的软件包名称? 它使用什么不同的反馈类型?
我们有两种方法来设置这些变量。 向后兼容的选项是使用setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo)
在代码中去配置。 为此,重写onServiceConnected()
方法并在其中配置你的服务。
@Override
protected void onServiceConnected() {
super.onServiceConnected();
//获取实例
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
//设置此服务想要收听的事件的类型。 其他不会传递给这个服务。
info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_FOCUSED;
//如果您只希望此服务与特定应用程序一起使用,请设置它们包名称在这里。
//否则,当服务激活时,它将会收听来自所有应用程序的事件。
info.packageNames = new String []{"com.ooowin.yixue.accessibilityservicetext"};
//设置您的服务将提供的反馈类型。
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
//仅当没有包特定的服务时才调用默认服务为生成的AccessibilityEvent类型。
// 这个服务是应用程序特定,因此标志不是必需的。 如果这是一个通用服务,值得考虑设置
//DEFAULT标志
//info.flags = AccessibilityServiceInfo.DEFAULT;
info.notificationTimeout = 100;
this.setServiceInfo(info);
}
第二个方法是使用XML文件配置服务。 某些配置选项(如canRetrieveWindowContent )仅在使用XML配置服务时可用。 以上使用XML定义的相同配置选项将如下所示:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
android:packageNames="com.ooowin.yixue.accessibilityservicetext"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"/>
这时候我们需要在清单文件中引用它,方法是在您的服务声明中添加一个指向XML文件的标签。
<service android:name=".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/accessibilityservice" />
</service>
请求允许BIND_ACCESSIBILITY_SERVICE
权限,确保只有系统可以绑定到它。
响应可访问性事件
现在我们就可以通过AccessibilityEvent.getEventType()
来确定事件的类型从而做出一系列操作。
int eventType = accessibilityEvent.getEventType();
switch(eventType){
case AccessibilityEvent.TYPE_VIEW_CLICKED:
Log.d("TAG","获取点击事件的响应");
break;
case AccessibilityEvent.TYPE_VIEW_FOCUSED:
Log.d("TAG","获取焦点的响应");
break;
}
结束语
利用AccessibilityService我们可以在手机非root的情况下实现静默安装的功能(不是真正的静默安装)和现在很多人都知道的抢红包功能。如果你想利用此方法获取一些个人隐私,我劝你还是打消这个念头吧,因为不可能,哈哈。