package com.halzhang.android.examples.accessibilityexample; import android.accessibilityservice.AccessibilityService; import android.os.Handler; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import java.util.List; public class WechatAccessibilityService extends AccessibilityService { private static final String TAG = "WechatService"; public static final int STEP_COUNT = 5; private Handler handler = new Handler(); private int mCurrentStep = 0; public WechatAccessibilityService() { } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate: WechatAccessibilityService"); } @Override public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) { int eventType = accessibilityEvent.getEventType(); // AccessibilityNodeInfo nodeInfo = accessibilityEvent.getSource(); switch (eventType) { case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: // AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); // if (nodeInfo != null) { // List<AccessibilityNodeInfo> nodeInfos = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/boi"); // AccessibilityNodeInfo faxian = nodeInfos.get(2).getParent(); // faxian.performAction(AccessibilityNodeInfo.ACTION_CLICK); //// faxian.recycle(); //// nodeInfo.recycle(); // } openChat(); openChatSettingPage(); openUserInfoPage(); getWeChatIdAndStartChat(); setMessageAndSend("http://www.halzhang.com/?id=" + mWxId); break; } } /** * 0、打开聊天界面 */ private void openChat() { if (mCurrentStep != 0) { return; } AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); if (nodeInfo != null) { List<AccessibilityNodeInfo> hmNodeInfos = nodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/hm"); for (AccessibilityNodeInfo hmNodeInfo : hmNodeInfos) { CharSequence text = hmNodeInfo.getText(); Log.i(TAG, "openChat: " + text); AccessibilityNodeInfo parent = hmNodeInfo.getParent(); parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); mCurrentStep++; break; } } } /** * 1、打开聊天设置界面 */ private void openChatSettingPage() { Log.i(TAG, "openChatSettingPage: start"); if (mCurrentStep != 1) { return; } AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow(); if (rootNodeInfo != null) { List<AccessibilityNodeInfo> chatSetting = rootNodeInfo.findAccessibilityNodeInfosByText("聊天信息"); if (chatSetting != null && chatSetting.size() == 1) { // TODO: 16/12/15 处理聊天界面中有『聊天信息』 Log.i(TAG, "openChatSettingPage: find chat setting button lo!"); chatSetting.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK); mCurrentStep++; } } } /** * 2、打开用户个人资料页面,并获取微信号,并点击“发消息”,打开聊天页面 */ private void openUserInfoPage() { Log.i(TAG, "openUserInfoPage: start"); if (mCurrentStep != 2) { return; } Log.i(TAG, "openUserInfoPage: start in"); AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow(); if (rootNodeInfo != null) { List<AccessibilityNodeInfo> bpoNodeInfos = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/bpo"); if (bpoNodeInfos != null && bpoNodeInfos.size() == 1) { AccessibilityNodeInfo bpoNodeInfo = bpoNodeInfos.get(0); AccessibilityNodeInfo bpoNodeInfoChild = bpoNodeInfo.getChild(0); bpoNodeInfoChild.performAction(AccessibilityNodeInfo.ACTION_CLICK); mCurrentStep++; } } } private String mWxId; /** * 3、获取微信号,生成特征链接,开始聊天 */ private void getWeChatIdAndStartChat() { Log.i(TAG, "getWeChatIdAndStartChat: start"); if (mCurrentStep != 3) { return; } AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow(); if (rootNodeInfo != null) { List<AccessibilityNodeInfo> accountNodeInfos = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ac2"); if (accountNodeInfos == null || accountNodeInfos.isEmpty()) { //页面跳转过程中,有可能获取不到 return; } AccessibilityNodeInfo accountTextViewNodeInfo = accountNodeInfos.get(0); String wechatIdText = accountTextViewNodeInfo.getText().toString(); Log.i(TAG, "getWeChatIdAndStartChat: Wechat id: " + wechatIdText); mWxId = wechatIdText.substring(4, wechatIdText.length()).trim(); AccessibilityNodeInfo sendButton = rootNodeInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/abw").get(0); sendButton.performAction(AccessibilityNodeInfo.ACTION_CLICK); mCurrentStep++; } } /** * 4、输入特征链接,发送,并返回 * * @param message */ private void setMessageAndSend(String message) { Log.i(TAG, "setMessageAndSend: start"); if (mCurrentStep != 4) { return; } AccessibilityNodeInfo rootNodeInfo = getRootInActiveWindow(); if (rootNodeInfo == null) { return; } AccessibilityNodeInfo editTextNodeInfo = Utils.getNodeInfoById(rootNodeInfo, "com.tencent.mm:id/a2u"); if (editTextNodeInfo == null) { return; } if ("android.widget.EditText".equals(editTextNodeInfo.getClassName())) { Log.i(TAG, "setMessageAndSend: find editText"); Utils.setText(this,editTextNodeInfo, message); } AccessibilityNodeInfo sendButtonNodeInfo = Utils.getNodeInfoById(rootNodeInfo, "com.tencent.mm:id/a30"); if (sendButtonNodeInfo == null) { return; } String buttonText = sendButtonNodeInfo.getText().toString().trim(); if ("发送".equals(buttonText) && "android.widget.Button".equals(sendButtonNodeInfo.getClassName())) { sendButtonNodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); mCurrentStep = 0; handler.postDelayed(new Runnable() { // 返回主界面,这里延迟执行,为了有更好的交互 @Override public void run() { performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); // 返回 } }, 1500); } } @Override public void onInterrupt() { } }