在不用root,不刷机实现云控系统的技术实现中,还有一种实现方式就是AccessibilityService。这种方式是借助Android自带的辅助功能实现模拟点击,模拟输入,模拟滑动等等操作。当然该种方式也有一定的限制性,相信大家在使用的过程中会慢慢发现其受限的地方。
话不多说,这里我们直接上代码,需要源码或者定制开发的请加威信393231639。
if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && event.getClassName().equals("com.tencent.mm.ui.LauncherUI")) { //记录打招呼人数置零 i = 0; //当前在微信聊天页就点开发现 openNext("发现"); //然后跳转到附近的人 openDelay(1000, "附近的人"); } else if (event.getClassName().equals("com.tencent.mm.plugin.nearby.ui.NearbyFriendsUI") && eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { prepos = 0; //当前在附近的人界面就点选人打招呼 AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("米以内"); Log.d("name", "附近的人列表人数: " + list.size()); if (i < (list.size() * page)) { list.get(i % list.size()).performAction(AccessibilityNodeInfo.ACTION_CLICK); list.get(i % list.size()).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); } else if (i == list.size() * page) { //本页已全部打招呼,所以下滑列表加载下一页,每次下滑的距离是一屏 for (int i = 0; i < nodeInfo.getChild(0).getChildCount(); i++) { if (nodeInfo.getChild(0).getChild(i).getClassName().equals("android.widget.ListView")) { AccessibilityNodeInfo node_lsv = nodeInfo.getChild(0).getChild(i); node_lsv.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); page++; new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException mE) { mE.printStackTrace(); } AccessibilityNodeInfo nodeInfo_ = getRootInActiveWindow(); //nodeInfo_.findFocus(); List<AccessibilityNodeInfo> list_ = nodeInfo_.findAccessibilityNodeInfosByText("米以内"); Log.d("name", "列表人数: " + list_.size()); //滑动之后,上一页的最后一个item为当前的第一个item,所以从第二个开始打招呼 // list_.get(1). list_.get(1).performAction(AccessibilityNodeInfo.ACTION_CLICK); list_.get(1).getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); } }).start(); } } }