AccessibilityService实现微信发红包功能
在AccessibilityService中我们可以做模拟操作,下面记述下通过AccessibilityService实现微信发红包的功能
1.配置AccessibilityService,需要通过集成AccessibilityService来执行操作。
public class TestAccessibilityService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
...
}
@Override
public void onInterrupt() {
VirtualControlManager.getInstance().onCancel();
}
}
使用时,需要在AndroidManifest.xml进行配置
<service android:name=".TestAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/accessibility_service_label"
<intent-filter
<action android:name="android.accessibilityservice.AccessibilityService" /
</intent-filter
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" /
</service
在res文件夹下创建xml文件夹,存放accessibility_service_config.xml
<?xml version="1.0" encoding="utf-8"?
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
android:canRetrieveWindowContent="true"
android:description="@string/accessibility_service_description"
android:notificationTimeout="100"/
<!--accessibilityEventTypes:表示该服务对界面中的哪些变化感兴趣,即哪些事件通知,比如窗口打开,滑动,
焦点变化,长按等.具体的值可以在AccessibilityEvent类中查到,如typeAllMask表示接受所有的事件通知.--
<!--accessibilityFeedbackType:表示反馈方式,比如是语音播放,还是震动--
<!--canRetrieveWindowContent:表示该服务能否访问活动窗口中的内容.也就是如果你希望在服务中获取窗体内容的化,则需要设置其值为true.--
<!--notificationTimeout:接受事件的时间间隔,通常将其设置为100即可.--
<!--packageNames:表示对该服务是用来监听哪个包的产生的事件--
这句话非常重要,后面会用到,切记
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
2.启动微信
Intent intent = new Intent(Intent.ACTION_MAIN);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent
// .FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
//加这个flag为了让微信能够进入的时候在会话列表
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(“com.tencent.mm”, “com.tencent.mm.ui.LauncherUI”);
intent.setComponent(cn);
context.startActivity(intent);
网上很多启动微信的代码在setFlags中的参数都是我注释的那段,用那段确实可以启动微信,但是不能保证微信启动后就是最原始的消息列表,而是微信任何界面(用户上次操作微信停留的界面),这样在想做模拟点击的操作,要加好多的判断界面的代码和操作,那么能否我启动微信时一定在消息列表呢,答案是可以的,那就是用下面这个flag,在启动微信的时候肯定会到消息列表,省去了我们的操作。
Intent.FLAG_ACTIVITY_CLEAR_TOP
3.执行操作
通过AccessibilityService的onAccessibilityEvent(…)方法,我们可以获取到界面view的信息,用getRootInActiveWindow(),一步步通过view的id,来模拟操作,到发红包界面。
这里需要注意,微信在跳转到红包界面的时候是有一个dialog加载动画的,不少人在跳转到发红包界面时,通过getRootInActiveWindow()获取到的对象不是null就是节点信息不对,这是因为一个dialog快速加载过去了,部分机器能看一闪的效果,如果手机性能比较好,这个dialog可能就看不到,但是代码执行的时候就拿不到节点信息。
尝试过加延时,但是延时过后,onAccessibilityEvent方法不执行,还是等于没有。
这时候就需要用到开篇讲的了这段代码了:
android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
加上这段代码后,我们就能通过onAccessibilityEvent来获取到发红包界面的view了,发一段在发红包界面填写金额的代码:
private void sendLuckMoney() {
AccessibilityNodeInfo rootInfo = accessibilityService.getRootInActiveWindow();
if (rootInfo != null) {
List<AccessibilityNodeInfo nodeInfoList = rootInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/clu");
for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {
Bundle arguments = new Bundle();
arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "10");
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Array - 209. Minimum Size Subarray Sum
- Array - 334. Increasing Triplet Subsequence
- Array - 123. Best Time to Buy and Sell Stock III
- Array - 122. Best Time to Buy and Sell Stock II
- Array - 121. Best Time to Buy and Sell Stock
- Array - 220. Contains Duplicate III
- Array - 219. Contains Duplicate II
- Array - 217. Contains Duplicate
- Array - 299. Bulls and Cows
- Array - 189. Rotate Array
- Array - 277 Find the Celebrity
- Array - 80. Remove Duplicates from Sorted Array II
- Array - 508. Wiggle Sort
- Array - 376. Wiggle Subsequence
- Array - 283. Move Zeroes