参考:http://www.jianshu.com/p/f67e950d84f7
源码: itsMelo https://github.com/itsMelo/WcAutoReply#fork-destination-box
扩展-自动抢红包http://blog.csdn.net/qq_15796477/article/details/52130416

思路
实现AccessibilityService,重写onAccessibilityEvent(final AccessibilityEvent event),判断event对象是TYPE_NOTIFICATION_STATE_CHANGED(通知栏事件)还是TYPE_WINDOW_STATE_CHANGED(窗体状态改变事件)。
若是TYPE_NOTIFICATION_STATE_CHANGED(通知栏事件)
1.判断是否处于锁屏状态。若是,则唤醒屏幕解锁。
2.判断app是否处于前台。若是,拉起微信。1s后,设置回复文本,模拟点击发送按钮发送。若处于后台,则拉起微信。重复1,2。
相关api
1.判断是否处于锁屏状态是通过KeyguardManager的实例inKeyguardRestrictedInputMode()方法实现。

 /*** 系统是否在锁屏状态** @return*/private boolean isScreenLocked() {KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);return keyguardManager.inKeyguardRestrictedInputMode();}

2.唤醒屏幕并解锁
通过PowerManager.WakeLock对象实例acquire()方法唤醒屏幕,KeyguardManager.KeyguardLock对象实例的disableKeyguard()实现解锁。

private void wakeAndUnlock() {//获取电源管理器对象PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);//获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的TagPowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");//点亮屏幕wl.acquire(1000);//得到键盘锁管理器对象KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);kl = km.newKeyguardLock("unLock");//解锁kl.disableKeyguard();}

3.判断app是否处于前台
原理是通过ActivityManager实例的getRunningTasks(1).get(0).topActivity()获取顶部的activity即ComponentName 对象,若ComponentName实例包名一致则在前台。

/*** 判断指定的应用是否在前台运行** @param packageName* @return*/
private boolean isAppForeground(String packageName) {ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);ComponentName cn = am.getRunningTasks(1).get(0).topActivity;String currentPackageName = cn.getPackageName();if (!TextUtils.isEmpty(currentPackageName) && currentPackageName.equals(packageName)) {return true;}return false;
}

4.调起微信

 Notification notification = (Notification) event.getParcelableData();PendingIntent pendingIntent = notification.contentIntent;pendingIntent.send();

5.设置自动回复的文本

getRootInActiveWindow获取活动窗口根节点,遍历子节点,通过nodeInfo.getContentDescription()获取微信对应的节点。获取EditText节点,通过ClipboardManager 对象设置ClipData,即设置给剪贴板对象。并执行粘贴操作。

  AccessibilityNodeInfo rootNode = getRootInActiveWindow();for (int i = 0; i < rootNode .getChildCount(); i++) {AccessibilityNodeInfo nodeInfo = rootNode.getChild(i);if (nodeInfo == null) {android.util.Log.d("maptrix", "nodeinfo = null");continue;}if(nodeInfo.getContentDescription() != null){int nindex = nodeInfo.getContentDescription().toString().indexOf(name);int cindex = nodeInfo.getContentDescription().toString().indexOf(scontent);if(nindex != -1){itemNodeinfo = nodeInfo;}}if ("android.widget.EditText".equals(nodeInfo.getClassName())) {Bundle arguments = new Bundle();arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD);arguments.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN,true);nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY,arguments);nodeInfo.performAction(AccessibilityNodeInfo.ACTION_FOCUS);ClipData clip = ClipData.newPlainText("label", content);ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);clipboardManager.setPrimaryClip(clip);nodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE);return true;}}

6.发送
nodeInfo.findAccessibilityNodeInfosByText(“发送”)获取发送按钮节点,performAction(AccessibilityNodeInfo.ACTION_CLICK)执行点击事件。

 /*** 寻找窗体中的“发送”按钮,并且点击。*/@SuppressLint("NewApi")private void send() {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if (nodeInfo != null) {List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("发送");if (list != null && list.size() > 0) {for (AccessibilityNodeInfo n : list) {if(n.getClassName().equals("android.widget.Button") && n.isEnabled()){n.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}} else {List<AccessibilityNodeInfo> liste = nodeInfo.findAccessibilityNodeInfosByText("Send");if (liste != null && liste.size() > 0) {for (AccessibilityNodeInfo n : liste) {if(n.getClassName().equals("android.widget.Button") && n.isEnabled()){n.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}}pressBackButton();}}

若是TYPE_WINDOW_STATE_CHANGED(窗体状态变化事件)

1.判断event类名是否是微信的LaunchUI(即event.getClassName().toString()
Equals(“com.tencent.mm.ui.LauncherUI”))若是,则设置回复文本。
2.判断设置回复文本是否成功,成功则发送。失败,则模拟点击事件,重新设置回复文本。设置成功后发送。
3.返回系统桌面,释放键盘键对象。

  case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:android.util.Log.d("maptrix", "get type window down event");if (!hasAction) break;itemNodeinfo = null;String className = event.getClassName().toString();if (className.equals("com.tencent.mm.ui.LauncherUI")) {if (fill()) {send();}else {if(itemNodeinfo != null){itemNodeinfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);handler.postDelayed(new Runnable() {@Overridepublic void run() {if (fill()) {send();}back2Home();release();hasAction = false;}}, 1000);break;}}}//bring2Front();back2Home();release();hasAction = false;break;

流程图:

微信自动回复功能实现相关推荐

  1. java 微信自动回复功能开发

    java 微信自动回复功能开发 准备文件: JCE无限制权限策略文件,里面是对应jdk6和7的文件 官网下载地址是http://www.oracle.com/technetwork/java/java ...

  2. 如开开发一个微信自动回复功能

    可以使用微信公众平台的 API 来开发微信自动回复功能.首先,需要在微信公众平台上注册一个账号,并创建一个公众号.然后,可以使用微信公众平台提供的 API 来实现对消息的自动回复. 具体来说,可以使用 ...

  3. 微信自动回复功能怎么实现?

    微信营销是网络经济时代企业或个人必不可少的营销模式之一.但众多企业和个人在使用微信营销时都面临着繁重的重复性回复,但有时可能没时间看微信错漏消息,长时间不回复,可能就错失一个潜在客户.能不能实现微信自 ...

  4. Android微信自动回复功能

    写在前面: 最近接到老大的一个需求,要求在手机端拦截微信的通知(Notification),从而获得联系人和内容.之后将联系人和内容发送到我们的硬件产品上,展示出来之后,再将我们想回复内容传给微信,并 ...

  5. 如何用计算机自动回复微信,10分钟教你用Python实现微信自动回复功能

    01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...

  6. python实现淘宝自动回复_10分钟教你用Python实现微信自动回复功能

    01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...

  7. python微信自动回复代码_使用python实现微信自动回复功能

    有时忙着时候,我们可以设置微信自动回复,这样又不会无视别人信息,又能节省时间,具体怎么实现呢?本文实例为大家分享了python实现微信自动回复的具体代码,供大家参考. 具体内容如下 预装: pytho ...

  8. 微信公众号自动回复功能

    微信公众号自动回复功能分为两种,一种自主开发,一种利用公众号自动开发,两种不可兼容,开发状态的自动回复功能,将导致编辑状态下的菜单,自动回复失效. WeixinchatController代码:  这 ...

  9. 微信自动回复和自动抢红包实现原理(二):自动回复

    阅读这篇文章前,你需要先了解AccessibilityService,可以先阅读我上一篇文章 微信自动回复和自动抢红包实现原理(一):AccessibilityService的介绍和配置 已经了解的朋 ...

最新文章

  1. wincc vbs mysql_Wincc VBS操作txt及SQL2005
  2. C++ - 实现strstr函数
  3. Jenkins TFS配置
  4. JavaScript实现排序算法
  5. TOP级CG行业云渲染服务的演进之路
  6. “七层架构”-----实践篇-登录小实例
  7. VSS(Visual SourceSafe) 代码管理器 使用技巧---快速登录
  8. 计算机原理寄存器基础知识,微机原理——基础知识及计算机基本组成
  9. 随机森林入门攻略(内含R、Python代码)
  10. 设计模式----装饰模式(C++实现)
  11. apache和php结合、apache的默认虚拟主机
  12. 计算机组成与结构 第四版pdf,计算机组成与体系结构(原书第4版)
  13. PJzhang:QQ输入法用户许可协议和隐私政策阅读
  14. python自动化实现QQ自动发说说
  15. Udacity 传感器融合笔记 (一)lidar
  16. word将空格替换为逗号
  17. R语言|lollipop plot
  18. Android---MVC/MVP/MVVM的演进
  19. 2021年9月PMP考试新鲜出炉,如何查询成绩?
  20. MS17-010(永恒之蓝)适合Windows 2008r2的补丁如何打?

热门文章

  1. java-常量和变量
  2. Android 颜色的半透明效果
  3. 二叉树算法--数据结构课程设计
  4. 使用openssl生成https证书
  5. Gensim错误'Word2Vec' object has no attribute 'vocab'
  6. Windows环境下编译Airsim
  7. form的onsubmit事件--表单提交前的验证最佳实现方式
  8. Angular5 + Bootstrap4使用示例
  9. 创新突破,索爱S5耳机实现空间音频和动态头部跟踪
  10. 试用HBuilder编辑H5移动开发