调用Android的无障碍服务
实现很简单,就是写一个服务,继承
AccessibilityService
在服务里面做一些操作
首先在你的 AndroidManifest.xml 文件中,把所有的
<activity></activity>
节点全部删除掉,创建一个
<service></service>
节点,配置如下:
<service
android:name=".RobMoneyService"
android:enabled="true"
android:exported="true"
android:label="@string/app_name"
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/accessibility" />
</service>
我们看到,其中引用了xml文件夹下的accessibility文件,这个文件是配置你的后台服务是注册了那个应用,比如你想抢微信红包,或者想抢QQ红包,或者不管微信还是QQ你都想在第一时间内抢到,那么你就可以给距下面的样式写自己的accessibility.xml文件了
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/desc"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm" />
里面有许多属性,那么
accessibilityEventTypes
是设置事件相应类型的,参数大概有下面这些:
accessibilityFeedbackType
是设置回馈给用户的方式的,有震动和语音播报,参数大概有下面一些:
canRetrieveWindowContent
表示你的服务能否获取到窗口中的内容,参数是boolean值,另外一些就见名知意了,不再赘述。。
接下来就要重写我们的服务类了,,,在继承
AccessibilityService
之后,需要重写
onAccessibilityEvent(AccessibilityEvent accessibilityEvent)
onInterrupt()
两个方法,由名字我们就可以知道,后一个是服务中断时使用,这里我们用不到,主要看第一个方法,参数列表里面就一个参数,是一个
AccessibilityEvent
类型的参数,那么我们可以通过这一个对象获得事件类型,再由事件类型判断接下来需要做什么样的工作,,,
我么知道,在锁屏的时候,有红包发过来,通知栏会有提示,那么我们就通过通知栏的提示来打开抢红包界面,,我们可以这样写:
int eventType = accessibilityEvent.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
break;
通过switch过滤不同的事件,这里我们就监听了通知栏改变时的事件。。
那么微信发来红包之后,在通知栏都会有
[微信红包]
这个字样,我们就利用他判断是不是微信红包,如果有这个字样,我们就打开通知进入抢红包界面,实现代码如下:
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
//检测通知栏是否有 [微信红包] 字样
List<CharSequence> texts = accessibilityEvent.getText();
if (!texts.isEmpty()) {
for (CharSequence text : texts) {
String content = text.toString();
Log.i("demo", "text:" + content);
if (content.contains("[微信红包]")) {
//模拟打开通知栏消息
if (accessibilityEvent.getParcelableData() != null
&& accessibilityEvent.getParcelableData() instanceof Notification) {
Notification notification = (Notification) accessibilityEvent.getParcelableData();
PendingIntent pendingIntent = notification.contentIntent;
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
}
}
}
break;
通过pendingIntent的send()方法,打开界面。。
接下来就开始打开红包了,,,可是,,以前版本的微信抢红包是这样子的
在拆红包的按钮上有三个字,我们可以通过控件的内容获取控件,并打开,,
可是啊可是,微信为了防止抢红包的第三方,把按钮属性做了一些操作,现在是这个样子
参数改成了下面这样:
按钮的内容跟描述都取消了,怎么办!!!
不用怕,不管腾讯怎么做手脚,控件的id都会在,我们可以通过id来获得控件,并添加点击,那么怎么实现呢???
上代码~~
private void openPacket() {
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
if (nodeInfo != null) {
AccessibilityNodeInfo nodeInfosById = findNodeInfosById(nodeInfo, "com.tencent.mm:id/ba_");
if (nodeInfosById !=null) {
nodeInfosById.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
就是这样了,红包打开喽。。。
网友评论