實現效果:html
實時監聽當前聊天頁面的最新一條消息,如圖:java
實現原理:android
一樣是利用AccessibilityService輔助服務,關於這個服務類還不瞭解的同窗能夠先看下我上一篇關於搶紅包的博客,原理都同樣:微信
http://www.cnblogs.com/cxk1995/p/6363574.htmlide
1.首先咱們先來看一下微信聊天界面的佈局,查看方法:佈局
AndroidStudio--Tools--Android--Android Device Monitor,點擊:this
2.如圖咱們能夠看到,其實每一條微信聊天記錄都是一個RelativeLayout:htm
3.再往下看,咱們又能夠發現,其實每個RelativeLayout下面,又包含了一個TextView,還有一個LinearLayout對象
TextView就是聊天的時間blog
LinearLayout下則包含了咱們所須要的聊天對象以及聊天信息,目前咱們只須要這個就好了。
4.分析完後,咱們思路就有了:
首先遍歷獲取每一個RelativeLayout下的LinearLayout,由於該LinearLayout存在resource-id(com.tencent.mm:id/o),因此咱們能夠很容易能夠獲取到,而後咱們再在LinearLayout中查找含有聊天對象(resource-id:com.tencent.mm:id/i_)以及聊天內容(resource-id:com.tencent.mm:id/ib)。
注:關於resource-id直接在上一步的查看佈局下發可看到,由於resource-id隨着版本的迭代可能會發生改變,因此也致使了一些不穩定因素。
核心代碼
代碼很少,也加了註釋,直接看代碼便可:
package com.cxk.wechatlog; import android.accessibilityservice.AccessibilityService; import android.content.Intent; import android.text.TextUtils; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast; import java.util.List; /** * Created by cxk on 2017/2/4. * email:471497226@qq.com * <p> * 獲取即時微信聊天記錄服務類 */ public class WeChatLogService extends AccessibilityService { /** * 聊天對象 */ private String ChatName; /** * 聊天最新一條記錄 */ private String ChatRecord = "test"; @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<AccessibilityNodeInfo> listChatRecord = rootNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/o"); if(listChatRecord.size()==0){ return; } //獲取最後一行聊天的線性佈局(便是最新的那條消息) AccessibilityNodeInfo finalNode = listChatRecord.get(listChatRecord.size() - 1); //獲取聊天對象list(其實只有size爲1) List<AccessibilityNodeInfo> imageName = finalNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/i_"); //獲取聊天信息list(其實只有size爲1) List<AccessibilityNodeInfo> record = finalNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ib"); if (imageName.size() != 0) { if (record.size() == 0) { //判斷當前這條消息是否是和上一條同樣,防止重複 if (!ChatRecord.equals("對方發的是圖片或者表情")) { //獲取聊天對象 ChatName = imageName.get(0).getContentDescription().toString().replace("頭像", ""); //獲取聊天信息 ChatRecord = "對方發的是圖片或者表情"; Log.e("AAAA", ChatName + ":" + "對方發的是圖片或者表情"); Toast.makeText(this, ChatName + ":" + ChatRecord, Toast.LENGTH_SHORT).show(); } } else { //判斷當前這條消息是否是和上一條同樣,防止重複 if (!ChatRecord.equals(record.get(0).getText().toString())) { //獲取聊天對象 ChatName = imageName.get(0).getContentDescription().toString().replace("頭像", ""); //獲取聊天信息 ChatRecord = record.get(0).getText().toString(); Log.e("AAAA", ChatName + ":" + ChatRecord); Toast.makeText(this, ChatName + ":" + ChatRecord, Toast.LENGTH_SHORT).show(); } } } } } /** * 必須重寫的方法:系統要中斷此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); } }
使用方法:
設置-輔助功能-無障礙-點擊WeChatLog開啓便可
寫在最後:
我的興趣研究,不建議用在非法途徑上!!Demo想要的話留言我發給你嘻嘻....