package com.example.a90678.wechat_group_send_17_07_02_17_35.access; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.os.Looper; import android.text.TextUtils; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import com.example.a90678.wechat_group_send_17_07_02_17_35.utils.L; import java.util.ArrayList; import java.util.List; import static android.content.Context.CLIPBOARD_SERVICE; import static java.lang.Thread.sleep; /** * Created by 90678 on 2017/7/5. */ public class AccessUtil { static AccessibilityNodeInfo editText; public static List<AccessibilityNodeInfo> nodeInfoList = new ArrayList<>(); public static final String WECHAT_PACKAGE_NAME = "com.tencent.mm"; /** * 通过文本查找 */ public static AccessibilityNodeInfo findNodeInfosByText(AccessibilityNodeInfo nodeInfo, String text) { List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(text); if (list == null || list.isEmpty()) { return null; } return list.get(0); } //通过组件名递归查找编辑框 public static void findNodeInfosByName(AccessibilityNodeInfo nodeInfo, String name) { if (TextUtils.isEmpty(name)) { L.e("name is null" + name); return; } if (nodeInfo == null) { L.e("nodeInfo is null " + nodeInfo); return; } // L.d("findNodeInfosByName "+nodeInfo.getText()); if (name.equals(nodeInfo.getClassName())) { editText = nodeInfo; return; } for (int i = 0; i < nodeInfo.getChildCount(); i++) { findNodeInfosByName(nodeInfo.getChild(i), name); } } public static List<AccessibilityNodeInfo> findNodeInfosById(AccessibilityNodeInfo nodeInfo, String id) { if (TextUtils.isEmpty(id)) { L.e("name is null" + id); return nodeInfoList; } if (nodeInfo == null) { L.e("nodeInfo is null " + nodeInfo); return nodeInfoList; } // L.d("findNodeInfosByName "+nodeInfo.getText()); String viewIdResourceName = nodeInfo.getViewIdResourceName(); L.d("viewIdResourceName " + viewIdResourceName + " child Count " + nodeInfo.getChildCount()); if (id.equals(viewIdResourceName)) { nodeInfoList.add(nodeInfo); return nodeInfoList; } for (int i = 0; i < nodeInfo.getChildCount(); i++) { findNodeInfosByName(nodeInfo.getChild(i), id); } return nodeInfoList; } /** * 点击事件 */ public static void performClick(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { return; } if (nodeInfo.isClickable()) { nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); } else { performClick(nodeInfo.getParent()); } } /** * 返回事件 */ public static void performBackWithDelay(final AccessibilityService service, AccessibilityNodeInfo nodeInfo) { CharSequence packageName = nodeInfo.getPackageName(); if (!(packageName+"").equals(WECHAT_PACKAGE_NAME)) { L.d("不是微信,不能后退 " + packageName); return; } if (service == null) { L.e("performBackWithDelay service is null"); return; } if (service.getRootInActiveWindow() == null) { L.e("performBackWithDelay rootNode is null"); return; } L.d("performBackWithDelay c "); new Thread(new Runnable() { @Override public void run() { try { sleep(3000); service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } /** * 返回事件 */ public static void performBack(final AccessibilityService service, AccessibilityNodeInfo nodeInfo) { CharSequence packageName = nodeInfo.getPackageName(); if (!(packageName+"").equals(WECHAT_PACKAGE_NAME)) { L.d("不是微信,不能后退 " + packageName); return; } if (service == null) { L.e("performBackWithDelay service is null"); return; } if (service.getRootInActiveWindow() == null) { L.e("performBackWithDelay rootNode is null"); return; } L.d("performBack Reboot "); service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); } /** * 返回事件 */ public static void performHome(final AccessibilityService service) { if (service == null) { L.e("performBackWithDelay service is null"); return; } if (service.getRootInActiveWindow() == null) { L.e("performBackWithDelay rootNode is null"); return; } L.d("performHome"); service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME); } /** * 点击匹配的nodeInfo * * @param str text关键字 */ public static boolean openNext(AccessibilityNodeInfo nodeInfo, String str) { if (nodeInfo == null) { L.d("rootWindow为空"); return false; } final List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(str); if (list == null || list.isEmpty()) { return false; } if (list != null && list.size() > 0) { final AccessibilityNodeInfo info = list.get(list.size() - 1); if (info == null) { return false; } final AccessibilityNodeInfo parent = info.getParent(); if(parent == null) { return false; } // new Thread(new Runnable() { // @Override // public void run() { // Looper.prepare(); // try { // sleep(2000); //// info.performAction(AccessibilityNodeInfo.ACTION_CLICK); // parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } // }).start(); info.performAction(AccessibilityNodeInfo.ACTION_CLICK); parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); return true; } else { // Toast.makeText(this, "找不到有效的节点", Toast.LENGTH_SHORT).show(); } return false; } //延迟打开界面 private void openDelay(final AccessibilityNodeInfo nodeInfo, final int delaytime, final String text) { new Thread(new Runnable() { @Override public void run() { Looper.prepare(); try { sleep(delaytime); } catch (InterruptedException mE) { mE.printStackTrace(); } openNext(nodeInfo, text); } }).start(); } //自动输入打招呼内容 public static void inputText(Context context, AccessibilityService service, AccessibilityNodeInfo nodeInfo, final String hello) { //找到当前获取焦点的view // AccessibilityNodeInfo target = nodeInfo.findFocus(AccessibilityNodeInfo.FOCUS_INPUT); AccessUtil.findNodeInfosByName(nodeInfo, "android.widget.EditText"); AccessibilityNodeInfo target = editText; if (target == null) { L.d("inputHello: null"); return; } else { L.d("inputHello: not null " + target.getText()); } ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("message", hello); clipboard.setPrimaryClip(clip); L.d("设置粘贴板"); // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { // target.performAction(AccessibilityNodeInfo.ACTION_PASTE); // } target.performAction(AccessibilityNodeInfo.ACTION_FOCUS); L.d("获取焦点"); target.performAction(AccessibilityNodeInfo.ACTION_PASTE); L.d("粘贴内容"); // openNext2("发送", nodeInfo, service);//点击发送 } //自动输入打招呼内容 public static boolean inputText2(Context context, AccessibilityService service, AccessibilityNodeInfo nodeInfo, final String hello) { //找到当前获取焦点的view // AccessibilityNodeInfo target = nodeInfo.findFocus(AccessibilityNodeInfo.FOCUS_INPUT); AccessUtil.findNodeInfosByName(nodeInfo, "android.widget.EditText"); AccessibilityNodeInfo target = editText; if (target == null) { L.d("inputHello: null"); return false; } else { L.d("inputHello: not null " + target.getText()); } ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("message", hello); clipboard.setPrimaryClip(clip); L.d("设置粘贴板"); // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { // target.performAction(AccessibilityNodeInfo.ACTION_PASTE); // } target.performAction(AccessibilityNodeInfo.ACTION_FOCUS); L.d("获取焦点"); target.performAction(AccessibilityNodeInfo.ACTION_PASTE); L.d("粘贴内容"); return true; } private void sendGroupMsg(AccessibilityNodeInfo nodeInfo) { if (nodeInfo == null) { L.e("sendGroupMsg nodeInfo " + nodeInfo); return; } findChildView2(nodeInfo, ""); } private void findChildView(AccessibilityNodeInfo info, String findText) { String text = info.getText() + ""; boolean isContentTxl = text.equals(findText); if (info.getChildCount() == 0) { if (!TextUtils.isEmpty(text) && isContentTxl) { L.e("Text:" + text + "是否" + isContentTxl + "是否2" + text.equals("通讯录")); performClick(info); } } else { for (int i = 0; i < info.getChildCount(); i++) { if (info.getChild(i) != null) { findChildView(info.getChild(i), findText); } } } } private void findChildView2(AccessibilityNodeInfo info, String parentText) { parentText = parentText + " |-- " + info.getText(); L.d("得到控件 " + parentText); for (int i = 0; i < info.getChildCount(); i++) { AccessibilityNodeInfo child = info.getChild(i); if (child != null) { // L.d("得到子控件 " + child.getText()); findChildView2(child, parentText + ""); } else { // L.d("得到所有控件" + info.getText()); } } } /** * 是否是在微信的主页面 */ public static boolean isWeChatMain (AccessibilityNodeInfo nodeInfo) { boolean b = !nodeInfo.findAccessibilityNodeInfosByText("微信").isEmpty() && !nodeInfo.findAccessibilityNodeInfosByText("通讯录").isEmpty() && !nodeInfo.findAccessibilityNodeInfosByText("发现").isEmpty() && !nodeInfo.findAccessibilityNodeInfosByText("我").isEmpty(); return b; } public boolean isGroupReplyServiceEnabled(Context context) { AccessibilityManager accessibilityManager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE); List<AccessibilityServiceInfo> accessibilityServices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC); for (AccessibilityServiceInfo info : accessibilityServices) { // if (info.getId().equals(getPackageName() + "/.WeChatGroupSendService")) { if (info.getId().equals(context.getPackageName() + "/.access.WeChatAccessService")) { return true; } } return false; } }