【实例简介】

微信聊天界面的布局,查看方法:

AndroidStudio--Tools--Android--Android Device Monitor

【实例截图】

【核心代码】

public class WeChatLogService extends AccessibilityService {

/**

* 聊天对象

*/

private String ChatName;

/**

* 聊天最新一条记录

*/

private String ChatRecord = "cxk";

/**

* 小视频的秒数,格式为00:00

*/

private String VideoSecond;

@Override

public void onAccessibilityEvent(AccessibilityEvent event) {

int eventType = event.getEventType();

switch (eventType) {

//每次在聊天界面中有新消息到来时都出触发该事件

case AccessibilityEvent.TYPE_VIEW_SCROLLED:

//获取当前聊天页面的根布局

AccessibilityNodeInfo rootNode = getRootInActiveWindow();

//获取聊天信息

getWeChatLog(rootNode);

break;

}

}

/**

* 遍历所有控件获取聊天信息

*

* @param rootNode

*/

private void getWeChatLog(AccessibilityNodeInfo rootNode) {

if (rootNode != null) {

//获取所有聊天的线性布局

List listChatRecord = rootNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/p");

if (listChatRecord.size() == 0) {

return;

}

//获取最后一行聊天的线性布局(即是最新的那条消息)

AccessibilityNodeInfo finalNode = listChatRecord.get(listChatRecord.size() - 1);

//获取聊天对象

GetChatName(finalNode);

//获取聊天内容

GetChatRecord(finalNode);

}

}

/**

* 遍历所有控件,找到头像Imagview,里面有对联系人的描述

*/

private void GetChatName(AccessibilityNodeInfo node) {

for (int i = 0; i < node.getChildCount(); i ) {

AccessibilityNodeInfo node1 = node.getChild(i);

if ("android.widget.ImageView".equals(node1.getClassName()) && node1.isClickable()) {

//获取聊天对象,这里两个if是为了确定找到的这个ImageView是头像的

if (!TextUtils.isEmpty(node1.getContentDescription())) {

ChatName = node1.getContentDescription().toString();

if (ChatName.contains("头像")) {

ChatName = ChatName.replace("头像", "");

}

}

}

GetChatName(node1);

}

}

/**

* 遍历所有控件:这里分四种情况

* 文字聊天: 一个TextView,并且他的父布局是android.widget.RelativeLayout

* 语音的秒数: 一个TextView,并且他的父布局是android.widget.RelativeLayout,但是他的格式是0"的格式,所以可以通过这个来区分

* 图片:一个ImageView,并且他的父布局是android.widget.FrameLayout,描述中包含“图片”字样(发过去的图片),发回来的图片现在还无法监听

* 表情:也是一个ImageView,并且他的父布局是android.widget.LinearLayout

* 小视频的秒数:一个TextView,并且他的父布局是android.widget.FrameLayout,但是他的格式是00:00"的格式,所以可以通过这个来区分

*

* @param node

*/

public void GetChatRecord(AccessibilityNodeInfo node) {

for (int i = 0; i < node.getChildCount(); i ) {

AccessibilityNodeInfo nodeChild = node.getChild(i);

//聊天内容是:文字聊天(包含语音秒数)

if ("android.widget.TextView".equals(nodeChild.getClassName()) && "android.widget.RelativeLayout".equals(nodeChild.getParent().getClassName().toString())) {

if (!TextUtils.isEmpty(nodeChild.getText())) {

String RecordText = nodeChild.getText().toString();

//这里加个if是为了防止多次触发TYPE_VIEW_SCROLLED而打印重复的信息

if (!RecordText.equals(ChatRecord)) {

ChatRecord = RecordText;

//判断是语音秒数还是正常的文字聊天,语音的话秒数格式为5"

if (ChatRecord.contains("\"")) {

Toast.makeText(this, ChatName "发了一条" ChatRecord "的语音", Toast.LENGTH_SHORT).show();

Log.e("WeChatLog",ChatName "发了一条" ChatRecord "的语音");

} else {

//这里在加多一层过滤条件,确保得到的是聊天信息,因为有可能是其他TextView的干扰,例如名片等

if (nodeChild.isLongClickable()) {

Toast.makeText(this, ChatName ":" ChatRecord, Toast.LENGTH_SHORT).show();

Log.e("WeChatLog",ChatName ":" ChatRecord);

}

}

return;

}

}

}

//聊天内容是:表情

if ("android.widget.ImageView".equals(nodeChild.getClassName()) && "android.widget.LinearLayout".equals(nodeChild.getParent().getClassName().toString())) {

Toast.makeText(this, ChatName "发的是表情", Toast.LENGTH_SHORT).show();

Log.e("WeChatLog",ChatName "发的是表情");

return;

}

//聊天内容是:图片

if ("android.widget.ImageView".equals(nodeChild.getClassName())) {

//安装软件的这一方发的图片(另一方发的暂时没实现)

if("android.widget.FrameLayout".equals(nodeChild.getParent().getClassName().toString())){

if(!TextUtils.isEmpty(nodeChild.getContentDescription())){

if(nodeChild.getContentDescription().toString().contains("图片")){

Toast.makeText(this, ChatName "发的是图片", Toast.LENGTH_SHORT).show();

Log.e("WeChatLog",ChatName "发的是图片");

}

}

}

}

//聊天内容是:小视频秒数,格式为00:00

if ("android.widget.TextView".equals(nodeChild.getClassName()) && "android.widget.FrameLayout".equals(nodeChild.getParent().getClassName().toString())) {

if (!TextUtils.isEmpty(nodeChild.getText())) {

String second = nodeChild.getText().toString().replace(":", "");

//正则表达式,确定是不是纯数字,并且做重复判断

if (second.matches("[0-9] ") && !second.equals(VideoSecond)) {

VideoSecond = second;

Toast.makeText(this, ChatName "发了一段" nodeChild.getText().toString() "的小视频", Toast.LENGTH_SHORT).show();

Log.e("WeChatLog","发了一段" nodeChild.getText().toString() "的小视频");

}

}

}

GetChatRecord(nodeChild);

}

}

/**

* 必须重写的方法:系统要中断此service返回的响应时会调用。在整个生命周期会被调用多次。

*/

@Override

public void onInterrupt() {

Toast.makeText(this, "我快被终结了啊-----", Toast.LENGTH_SHORT).show();

}

/**

* 服务开始连接

*/

@Override

protected void onServiceConnected() {

Toast.makeText(this, "服务已开启", Toast.LENGTH_SHORT).show();

super.onServiceConnected();

}

/**

* 服务断开

*

* @param intent

* @return

*/

@Override

public boolean onUnbind(Intent intent) {

Toast.makeText(this, "服务已被关闭", Toast.LENGTH_SHORT).show();

return super.onUnbind(intent);

}

java读取微信消息_android 读取微信聊天内容 示例源码(AccessibilityService)相关推荐

  1. 类似QQ聊天软件也能用Java实现啦!(多人聊天原理附源码)

    多人聊天室原理图 源码 工具类: 该类用于关闭各种流. public class CloseUtil {public static void CloseAll(Closeable... closeab ...

  2. html5 微信签到墙,3D签到墙 webgl示例源码(three.js)

    [实例简介] [实例截图] [核心代码] three.js css3d - periodic table html, body { height: 100%; } body { background- ...

  3. java实现验证消息的确来自微信服务器

    java实现验证消息的确来自微信服务器 验证消息的确来自微信服务器Get方法 SHA1加密 异常处理 开发者提交信息后,微信服务器将发送 GET 请求到填写的服务器地址 URL 上 GET请求携带参数 ...

  4. jquery 背景特效实现_html5实现的仿网页版微信聊天界面效果源码

    码农那点事儿 关注我们,一起学习进步 这是一款基于html5实现的仿网页版微信聊天界面效果源码,可实现微信网页版聊天界面效果,在编辑框编辑文字之后按Ctrl+Enter键即可提交文字到聊天对话框上.整 ...

  5. 微信消息收发与微信内部emoji表情转义

    微信消息收发与微信内部emoji表情转义 目录 微信内部emoji表情转义与消息收发 一.概述 二.常用标准emoji表情字符.微信内部转义符.unicode对照表 1.比如 2.微信聊天窗口emoj ...

  6. python自动回复微信群的消息_程序员用python实现微信消息群发和微信自动回复

    程序员用python实现微信消息群发和微信自动回复 每当逢年过节的时候, 你是否会遇到要给亲朋好友发祝福而不得不重复复制.改名.发送的麻烦, 还有收到许多好友祝福又来不及回复的情况.如果有,这篇文章正 ...

  7. 首发全DIY强大微信朋友圈截图制作生成小程序源码下载点赞,评论等等

    这是一款朋友圈截图制作的一款小程序源码 主要的特点是DIY,之前小编发布过朋友圈截图的小程序 不管之前那款小程序只能生成点赞数量,无法获取用户名等等 但是这一款就不一样了,这一款刚刚也说了特点是DIY ...

  8. 旧版3.1.0版本文章内有新版独立微信社群人脉系统社群空间站最新源码开源+详细教程

    介绍: 3.1.0版本独立微信社群人脉系统社群空间站最新源码开源+详细教程 刚想到3.1.0版本的还没有分享只分享了3.1.1版本和2.8.2版本的现在把3.1.0版本的也分享出来比较完善 功能各有各 ...

  9. 微信小程序支付功能-服务器端实现(附源码)

    实现了小程序最新的V3版本支付功能, 包括:支付.支付通知.退款.退款通知. 服务器端使用java开发,springboot框架 源码链接在评论中 微信小程序支付功能-服务器端实现(附源码)_哔哩哔哩 ...

最新文章

  1. 转:js-sdk探索之微信网页分享
  2. Go语言连接 zookeeper
  3. python学习第一周(1)
  4. ArcGIS Server--揭开你的神秘面纱
  5. 《系统集成项目管理工程师》必背100个知识点-14项目章程的内容
  6. rxjava背压怎样使用_使用MicroProfile应用隔板和背压
  7. 大规模分布式系统资源管理(二)
  8. 手机号段对应地区编码_什么是编码器?了解两种类型的编码器
  9. 速读原著-TCP/IP(互联网与实现)
  10. 总结《Video rate spectral imaging using a coded aperture snapshot spectral imager》
  11. 联邦学习FATE社区2021年度生态峰会倒计时1天,请查收这份参会攻略
  12. 在上海创业的日子之注册公司的详细流程
  13. 计算机网络路由器与路由协议配置,OSPF路由协议配置(计算机网络实验).doc
  14. Blbl里面终末的女武神的精彩片段批量采集的方法
  15. 异地远程群晖NAS教程【cpolar内网穿透】
  16. 初识MFC----MFC简介
  17. 第8天-信息收集——站点搭建,WAF等
  18. 11. Nginx HTTPS
  19. Python-Flask开发微电影网站(八)
  20. iOS Returning block that lives on the local stack 错误解决

热门文章

  1. mysql 怎么统计年龄段_mysql统计年龄段分布
  2. 浏览器播放rtsp视频流:3、rtsp转webrtc播放
  3. VBox组件内部局域网
  4. IgH详解十一、IgH(FSM)有限状态机
  5. Android png图片彩色转黑白,透明度打印变黑色的解决方法
  6. MFC多视频播放界面模板--(二)搭建视频播放界面空壳程序
  7. 根服务器能当蜘蛛种子网站吗,网站秒收录经验分享,利用蜘蛛池你也能做到
  8. 史上最强C语言教程----程序的编译与预处理(2)
  9. python 收银系统_python 编程练习——根据一张单据设计点单收银系统
  10. 从一个小故事理解锁升级(无锁、偏向锁、轻量级锁、重量级锁)