java读取微信消息_android 读取微信聊天内容 示例源码(AccessibilityService)
【实例简介】
微信聊天界面的布局,查看方法:
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)相关推荐
- 类似QQ聊天软件也能用Java实现啦!(多人聊天原理附源码)
多人聊天室原理图 源码 工具类: 该类用于关闭各种流. public class CloseUtil {public static void CloseAll(Closeable... closeab ...
- html5 微信签到墙,3D签到墙 webgl示例源码(three.js)
[实例简介] [实例截图] [核心代码] three.js css3d - periodic table html, body { height: 100%; } body { background- ...
- java实现验证消息的确来自微信服务器
java实现验证消息的确来自微信服务器 验证消息的确来自微信服务器Get方法 SHA1加密 异常处理 开发者提交信息后,微信服务器将发送 GET 请求到填写的服务器地址 URL 上 GET请求携带参数 ...
- jquery 背景特效实现_html5实现的仿网页版微信聊天界面效果源码
码农那点事儿 关注我们,一起学习进步 这是一款基于html5实现的仿网页版微信聊天界面效果源码,可实现微信网页版聊天界面效果,在编辑框编辑文字之后按Ctrl+Enter键即可提交文字到聊天对话框上.整 ...
- 微信消息收发与微信内部emoji表情转义
微信消息收发与微信内部emoji表情转义 目录 微信内部emoji表情转义与消息收发 一.概述 二.常用标准emoji表情字符.微信内部转义符.unicode对照表 1.比如 2.微信聊天窗口emoj ...
- python自动回复微信群的消息_程序员用python实现微信消息群发和微信自动回复
程序员用python实现微信消息群发和微信自动回复 每当逢年过节的时候, 你是否会遇到要给亲朋好友发祝福而不得不重复复制.改名.发送的麻烦, 还有收到许多好友祝福又来不及回复的情况.如果有,这篇文章正 ...
- 首发全DIY强大微信朋友圈截图制作生成小程序源码下载点赞,评论等等
这是一款朋友圈截图制作的一款小程序源码 主要的特点是DIY,之前小编发布过朋友圈截图的小程序 不管之前那款小程序只能生成点赞数量,无法获取用户名等等 但是这一款就不一样了,这一款刚刚也说了特点是DIY ...
- 旧版3.1.0版本文章内有新版独立微信社群人脉系统社群空间站最新源码开源+详细教程
介绍: 3.1.0版本独立微信社群人脉系统社群空间站最新源码开源+详细教程 刚想到3.1.0版本的还没有分享只分享了3.1.1版本和2.8.2版本的现在把3.1.0版本的也分享出来比较完善 功能各有各 ...
- 微信小程序支付功能-服务器端实现(附源码)
实现了小程序最新的V3版本支付功能, 包括:支付.支付通知.退款.退款通知. 服务器端使用java开发,springboot框架 源码链接在评论中 微信小程序支付功能-服务器端实现(附源码)_哔哩哔哩 ...
最新文章
- 转:js-sdk探索之微信网页分享
- Go语言连接 zookeeper
- python学习第一周(1)
- ArcGIS Server--揭开你的神秘面纱
- 《系统集成项目管理工程师》必背100个知识点-14项目章程的内容
- rxjava背压怎样使用_使用MicroProfile应用隔板和背压
- 大规模分布式系统资源管理(二)
- 手机号段对应地区编码_什么是编码器?了解两种类型的编码器
- 速读原著-TCP/IP(互联网与实现)
- 总结《Video rate spectral imaging using a coded aperture snapshot spectral imager》
- 联邦学习FATE社区2021年度生态峰会倒计时1天,请查收这份参会攻略
- 在上海创业的日子之注册公司的详细流程
- 计算机网络路由器与路由协议配置,OSPF路由协议配置(计算机网络实验).doc
- Blbl里面终末的女武神的精彩片段批量采集的方法
- 异地远程群晖NAS教程【cpolar内网穿透】
- 初识MFC----MFC简介
- 第8天-信息收集——站点搭建,WAF等
- 11. Nginx HTTPS
- Python-Flask开发微电影网站(八)
- iOS Returning block that lives on the local stack 错误解决
热门文章
- mysql 怎么统计年龄段_mysql统计年龄段分布
- 浏览器播放rtsp视频流:3、rtsp转webrtc播放
- VBox组件内部局域网
- IgH详解十一、IgH(FSM)有限状态机
- Android png图片彩色转黑白,透明度打印变黑色的解决方法
- MFC多视频播放界面模板--(二)搭建视频播放界面空壳程序
- 根服务器能当蜘蛛种子网站吗,网站秒收录经验分享,利用蜘蛛池你也能做到
- 史上最强C语言教程----程序的编译与预处理(2)
- python 收银系统_python 编程练习——根据一张单据设计点单收银系统
- 从一个小故事理解锁升级(无锁、偏向锁、轻量级锁、重量级锁)