代码传送门:
https://github.com/AndroidMsky/WXhongbao
欢迎点星星~
原理:
通过AccessibilityService监听到状态栏通知,进行模拟点击,获取屏幕中view节点为领取红包的list并且点击最后一个。
如果不通过状态栏通知,通过视图变化AccessibilityEvent的2048事件也是就
public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800;每次接受到新消息都会有这个时间的回调:
public void onAccessibilityEvent(AccessibilityEvent event) {int eventType = event.getEventType();if (auto) Log.e("AAAAAAAA", "有事件" + eventType);switch (eventType) { //当通知栏发生改变时 case 2048:pubclassName = event.getClassName().toString();Log.e("AAAAAAAA", "有2048事件" + pubclassName + auto);if (!auto && pubclassName.equals("android.widget.TextView") && ALL) { Log.e("AAAAAAAA", "有2048事件被识别" + auto + pubclassName); getLastPacket(1);}if (auto && WXMAIN) { getLastPacket(); auto = false;}break;所以在接受的时候,去处理一下去点击领取红包。然而这个方法会被频发调用,我们就加一个”Android.widget.TextView”事件类的筛选,然后还是会被很频繁调用,会比较迟性能耗电。
private void getLastPacket(int c) {Log.e("AAAAAAAA", "新方法" + parents.size());AccessibilityNodeInfo rootNode = getRootInActiveWindow();recycle(rootNode);Log.e("AAAAAAAA", "last++" + lastbagnum + "当前页面红包数" + parents.size());if (parents.size() > 0 && WXMAIN) { Log.e("AAAAAAAA", "页面大于O且在微信界面"); if (lastbagnum < parents.size())parents.get(parents.size() - 1).performAction(AccessibilityNodeInfo.ACTION_CLICK); lastbagnum = parents.size(); parents.clear();} }目前在通过插件领过几个红包后,一个聊天界面突然发第一个红包(没有通知栏)会有一定几率领取不到,再继续发就正常了,应该是清空问题,该bug笔者也在更改逻辑中。
private void wakeAndUnlock2(boolean b) {if(b){ //获取电源管理器对象 pm=(PowerManager) getSystemService(Context.POWER_SERVICE); //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright"); //点亮屏幕 wl.acquire(); //得到键盘锁管理器对象 km= (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE); kl = km.newKeyguardLock("unLock"); //解锁 kl.disableKeyguard();}else{ //锁屏 kl.reenableKeyguard(); //释放wakeLock,关灯 wl.release();} }接受到通知栏的红包消息亮屏设置标志位为自动领取,调取领取函数:
if (content.contains("[微信红包]")) { if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {Notification notification = (Notification) event.getParcelableData();PendingIntent pendingIntent = notification.contentIntent;try { auto = true; wakeAndUnlock2(true); pendingIntent.send(); Log.e("demo", "进入微信" + auto + event.getClassName().toString());} catch (Exception e) { e.printStackTrace();} }}点击界面控件方法:(不同微信版本控件id不一样我的是6.3.25)如果不知道怎么获取这个id可以看下面的参考文献最后一个,右侧的resource-id就是这个id
public void start(View v) {if (AirAccessibilityService.ALL) { AirAccessibilityService.ALL = false; ((Button) v).setText("对话内监控+关");} else { AirAccessibilityService.ALL = true; ((Button) v).setText("对话内监控+开");}; }AccessibilityService的确很吊,你用AccessibilityService或者root后的安卓手机能干太多事了,或好或坏,但毕竟技术是无罪的。