messageEx
This commit is contained in:
@@ -0,0 +1,704 @@
|
||||
package com.xscm.moduleutil.listener;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.blankj.utilcode.util.GsonUtils;
|
||||
import com.blankj.utilcode.util.LogUtils;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener;
|
||||
import com.tencent.imsdk.v2.V2TIMCallback;
|
||||
import com.tencent.imsdk.v2.V2TIMConversationListener;
|
||||
import com.tencent.imsdk.v2.V2TIMGroupListener;
|
||||
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
|
||||
import com.tencent.imsdk.v2.V2TIMManager;
|
||||
import com.tencent.imsdk.v2.V2TIMMessage;
|
||||
import com.tencent.imsdk.v2.V2TIMSendCallback;
|
||||
import com.tencent.imsdk.v2.V2TIMSimpleMsgListener;
|
||||
import com.tencent.imsdk.v2.V2TIMUserInfo;
|
||||
import com.xscm.moduleutil.base.CommonAppContext;
|
||||
import com.xscm.moduleutil.bean.HeadlineBean;
|
||||
import com.xscm.moduleutil.bean.RoomMessageEvent;
|
||||
import com.xscm.moduleutil.event.UnreadCountEvent;
|
||||
import com.xscm.moduleutil.http.RetrofitClient;
|
||||
import com.xscm.moduleutil.utils.CustomMsgCode;
|
||||
import com.xscm.moduleutil.utils.SpUtil;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
/**
|
||||
* @author qx
|
||||
* @data 2025/6/17
|
||||
* @description: 接收消息
|
||||
*/
|
||||
public class MessageExListenerSingleton {
|
||||
private static boolean isInitialized = false;
|
||||
private static MessageExListenerSingleton instance;
|
||||
private List<OnMessageReceivedListener> listeners = new ArrayList<>();
|
||||
private V2TIMSimpleMsgListener simpleMsgListener;
|
||||
private V2TIMAdvancedMsgListener v2TIMAdvancedMsgListener;
|
||||
private static String mRoomId = "";
|
||||
public static String groupId;
|
||||
private V2TIMGroupListener groupListener;
|
||||
private V2TIMConversationListener conversationListener; // 需要保存引用
|
||||
|
||||
// 添加操作状态标记
|
||||
private volatile boolean isGroupOperationInProgress = false;
|
||||
private final Object groupOperationLock = new Object();
|
||||
private Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||
|
||||
// 添加消息缓存机制
|
||||
private static final int MAX_CACHED_MESSAGES = 20;
|
||||
private final Map<String, List<RoomMessageEvent>> cachedMessages = new ConcurrentHashMap<>();
|
||||
private final Set<String> joinedRooms = ConcurrentHashMap.newKeySet();
|
||||
|
||||
private OnMsgTaskListener onMsgTaskListener;
|
||||
|
||||
// private boolean listenersAdded = false; // 标记监听器是否已添加
|
||||
// 1. 添加新的监听器接口
|
||||
public interface PublicScreenMessageListener {
|
||||
void onPublicScreenMessageReceived(RoomMessageEvent message);
|
||||
}
|
||||
|
||||
private List<PublicScreenMessageListener> publicScreenListeners = new ArrayList<>();
|
||||
|
||||
// 添加监听器 // 替换原有的 addPublicScreenMessageListener 方法
|
||||
public void addPublicScreenMessageListener(PublicScreenMessageListener listener) {
|
||||
if (listener == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (publicScreenListeners) {
|
||||
if (!publicScreenListeners.contains(listener)) {
|
||||
try {
|
||||
publicScreenListeners.add(listener);
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("MessageListener", "添加 PublicScreenMessageListener 失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 同时修改 removePublicScreenMessageListener 方法
|
||||
public void removePublicScreenMessageListener(PublicScreenMessageListener listener) {
|
||||
mRoomId = "";
|
||||
if (listener == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (publicScreenListeners) {
|
||||
try {
|
||||
publicScreenListeners.remove(listener);
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("MessageListener", "移除 PublicScreenMessageListener 失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 修改 notify 方法以增加保护
|
||||
private void notifyPublicScreenListeners(RoomMessageEvent message) {
|
||||
synchronized (publicScreenListeners) {
|
||||
// 创建副本以避免并发修改异常
|
||||
List<PublicScreenMessageListener> listenersCopy = new ArrayList<>(publicScreenListeners);
|
||||
for (PublicScreenMessageListener listener : listenersCopy) {
|
||||
try {
|
||||
listener.onPublicScreenMessageReceived(message);
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("MessageListener", "通知 PublicScreenMessageListener 失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private MessageExListenerSingleton() {
|
||||
if (!isInitialized) {
|
||||
isInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static MessageExListenerSingleton getInstance() {
|
||||
synchronized (MessageExListenerSingleton.class) {
|
||||
if (instance == null) {
|
||||
instance = new MessageExListenerSingleton();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 缓存消息(用于在Fragment未准备好时存储消息)
|
||||
*/
|
||||
private void cacheMessage(String roomId, RoomMessageEvent message) {
|
||||
if (TextUtils.isEmpty(roomId) || message == null) {
|
||||
return;
|
||||
}
|
||||
// 标记该房间有待处理的消息
|
||||
List<RoomMessageEvent> roomMessages = cachedMessages.computeIfAbsent(roomId, k -> new ArrayList<>());
|
||||
|
||||
// 限制每个房间的缓存消息数量
|
||||
if (roomMessages.size() >= MAX_CACHED_MESSAGES) {
|
||||
roomMessages.remove(0); // 移除最旧的消息
|
||||
}
|
||||
|
||||
roomMessages.add(message);
|
||||
LogUtils.d("MessageListener", "缓存消息: roomId=" + roomId + ", msgType=" + message.getMsgType());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取并清除指定房间的缓存消息
|
||||
*/
|
||||
public List<RoomMessageEvent> getAndClearCachedMessages(String roomId) {
|
||||
if (TextUtils.isEmpty(roomId)) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
List<RoomMessageEvent> messages = cachedMessages.remove(roomId);
|
||||
if (messages == null) {
|
||||
messages = new ArrayList<>();
|
||||
}
|
||||
|
||||
LogUtils.d("MessageListener", "获取并清除缓存消息: roomId=" + roomId + ", count=" + messages.size());
|
||||
return messages;
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记房间已加入
|
||||
*/
|
||||
public void markRoomJoined(String roomId) {
|
||||
if (!TextUtils.isEmpty(roomId)) {
|
||||
joinedRooms.add(roomId);
|
||||
LogUtils.d("MessageListener", "标记房间已加入: " + roomId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查房间是否已加入
|
||||
*/
|
||||
public boolean isRoomJoined(String roomId) {
|
||||
return !TextUtils.isEmpty(roomId) && joinedRooms.contains(roomId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除房间加入标记
|
||||
*/
|
||||
public void clearRoomJoined(String roomId) {
|
||||
if (!TextUtils.isEmpty(roomId)) {
|
||||
joinedRooms.remove(roomId);
|
||||
LogUtils.d("MessageListener", "清除房间加入标记: " + roomId);
|
||||
}
|
||||
}
|
||||
|
||||
// 修改 joinGroup 方法,确保先退出再加入
|
||||
public void joinGroup(String roomId) {
|
||||
if (TextUtils.isEmpty(roomId)) {
|
||||
return;
|
||||
}
|
||||
if (Objects.equals(mRoomId, roomId))
|
||||
return;
|
||||
synchronized (groupOperationLock) {
|
||||
if (isGroupOperationInProgress) {
|
||||
// 如果有操作正在进行,延迟执行
|
||||
mainHandler.removeCallbacksAndMessages(null);
|
||||
mainHandler.postDelayed(() -> joinGroup(roomId), 100);
|
||||
return;
|
||||
}
|
||||
|
||||
isGroupOperationInProgress = true;
|
||||
}
|
||||
mRoomId = roomId;
|
||||
new Thread(() -> {
|
||||
try {
|
||||
// 先退出当前群组(如果需要)
|
||||
if (groupId != null && !groupId.equals(roomId)) {
|
||||
LogUtils.d("MessageListener", "开始退出群组: " + groupId + "____room:" + roomId);
|
||||
CountDownLatch quitLatch = new CountDownLatch(1);
|
||||
boolean[] quitSuccess = {false};
|
||||
|
||||
try {
|
||||
V2TIMManager.getInstance().quitGroup("room" + groupId, new V2TIMCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
LogUtils.d("MessageListener", "退出群组成功: " + groupId + "____room:" + roomId);
|
||||
quitSuccess[0] = true;
|
||||
quitLatch.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String desc) {
|
||||
LogUtils.e("MessageListener", "退出群组失败: " + groupId + "____room:" + roomId + ", code=" + code + ", desc=" + desc);
|
||||
quitSuccess[0] = false;
|
||||
quitLatch.countDown();
|
||||
}
|
||||
});
|
||||
|
||||
// 等待退出操作完成,最多等待3秒
|
||||
try {
|
||||
quitLatch.await(3, java.util.concurrent.TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("MessageListener", "退出群组异常: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// 加入新群组
|
||||
LogUtils.d("MessageListener", "开始加入群组: " + roomId);
|
||||
CountDownLatch joinLatch = new CountDownLatch(1);
|
||||
boolean[] joinSuccess = {false};
|
||||
|
||||
try {
|
||||
// 确保监听器已添加
|
||||
ensureListenersAdded();
|
||||
|
||||
V2TIMManager.getInstance().joinGroup("room" + roomId, "申请加入", new V2TIMCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
LogUtils.d("MessageListener", "加入im群组成功: " + roomId);
|
||||
joinSuccess[0] = true;
|
||||
groupId = roomId;
|
||||
joinLatch.countDown();
|
||||
// 标记房间已加入
|
||||
markRoomJoined(roomId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String desc) {
|
||||
LogUtils.e("MessageListener", "加入群组失败: " + roomId + ", code=" + code + ", desc=" + desc);
|
||||
joinSuccess[0] = false;
|
||||
joinLatch.countDown();
|
||||
}
|
||||
});
|
||||
|
||||
// 等待加入操作完成,最多等待3秒
|
||||
try {
|
||||
joinLatch.await(3, java.util.concurrent.TimeUnit.SECONDS);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("MessageListener", "加入群组异常: " + e.getMessage());
|
||||
}
|
||||
|
||||
LogUtils.d("MessageListener", "群组操作完成 - 退出成功: " + (groupId == null || !groupId.equals(roomId)) + ", 加入成功: " + joinSuccess[0]);
|
||||
|
||||
} finally {
|
||||
synchronized (groupOperationLock) {
|
||||
isGroupOperationInProgress = false;
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
|
||||
|
||||
private void initListeners() {
|
||||
// 简单消息监听器
|
||||
if (simpleMsgListener == null) {
|
||||
simpleMsgListener = new V2TIMSimpleMsgListener() {
|
||||
@Override
|
||||
public void onRecvC2CTextMessage(String msgID, V2TIMUserInfo sender, String text) {
|
||||
LogUtils.d("C2C 文本消息 " + sender.getNickName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRecvC2CCustomMessage(String msgID, V2TIMUserInfo sender, byte[] customData) {
|
||||
LogUtils.d("C2C 自定义(信令)消息 " + sender.getNickName());
|
||||
String message = new String(customData, StandardCharsets.UTF_8);
|
||||
RoomMessageEvent event = GsonUtils.fromJson(message, RoomMessageEvent.class);
|
||||
if (event.getMsgType() == 130 || event.getMsgType() == 131) {
|
||||
// EventBus.getDefault().post(event);
|
||||
RetrofitClient.getInstance().getCpListener().onReceiveMsg(event);
|
||||
} else if (event.getMsgType() == CustomMsgCode.INSTANCE.getCODE_TASK_APPRENTICE_JOIN_ROOM()) {
|
||||
if (onMsgTaskListener != null) {
|
||||
onMsgTaskListener.onMsgTask(event);
|
||||
}
|
||||
} else {
|
||||
notifyMessageReceived(event);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRecvGroupTextMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, String text) {
|
||||
LogUtils.d("群文本消息:群组 " + groupID + " 中 " + sender.getNickName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRecvGroupCustomMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, byte[] customData) {
|
||||
LogUtils.d("收到群自定义消息:群组 " + groupID + " 中 " + sender.getNickName());
|
||||
if (!groupID.equals("")) {
|
||||
String message = new String(customData, StandardCharsets.UTF_8);
|
||||
RoomMessageEvent event = GsonUtils.fromJson(message, RoomMessageEvent.class);
|
||||
notifyMessageReceived(event);
|
||||
LogUtils.d("收到群自定义消息(信令):", message);
|
||||
} else {
|
||||
String message = new String(customData, StandardCharsets.UTF_8);
|
||||
LogUtils.d("收到群自定义消息(信令):", message);
|
||||
HeadlineBean event = GsonUtils.fromJson(message, HeadlineBean.class);
|
||||
EventBus.getDefault().post(event);
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// 高级消息监听器
|
||||
if (v2TIMAdvancedMsgListener == null) {
|
||||
v2TIMAdvancedMsgListener = new V2TIMAdvancedMsgListener() {
|
||||
@Override
|
||||
public void onRecvNewMessage(V2TIMMessage msg) {
|
||||
super.onRecvNewMessage(msg);
|
||||
if (msg.isBroadcastMessage()) {
|
||||
// 收到了广播消息
|
||||
String message = new String(msg.getCustomElem().getData(), StandardCharsets.UTF_8);
|
||||
LogUtils.e("收到广播消息(系统):", message);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// 群组监听器
|
||||
if (groupListener == null) {
|
||||
groupListener = new V2TIMGroupListener() {
|
||||
@Override
|
||||
public void onMemberEnter(String groupID, List<V2TIMGroupMemberInfo> memberList) {
|
||||
// 有新成员加入群,该群所有的成员都能收到
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMemberLeave(String groupID, V2TIMGroupMemberInfo member) {
|
||||
// 有成员离开群,该群所有的成员都能收到
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceiveRESTCustomData(String groupID, byte[] customData) {
|
||||
String message = "";
|
||||
try {
|
||||
|
||||
message = new String(customData, StandardCharsets.UTF_8);
|
||||
LogUtils.e("收到群自定义消息(系统):" + message);
|
||||
} catch (Exception e) {
|
||||
// 处理转换过程中可能出现的异常,例如记录日志
|
||||
LogUtils.e("转换 customData 为 String 时出错:" + e.getMessage());
|
||||
return; // 退出方法,避免后续代码执行
|
||||
}
|
||||
|
||||
RoomMessageEvent event = null;
|
||||
try {
|
||||
// 特殊处理某些消息类型
|
||||
event = parseSpecialMessageTypes(message);
|
||||
if (event == null) {
|
||||
// 使用默认解析
|
||||
event = GsonUtils.fromJson(message, RoomMessageEvent.class);
|
||||
}
|
||||
LogUtils.e("收到群自定义消息:" + mRoomId + "===" + event);
|
||||
// event = GsonUtils.fromJson(message, RoomMessageEvent.class);
|
||||
} catch (Exception e) {
|
||||
// 处理 JSON 解析过程中可能出现的异常,例如记录日志
|
||||
LogUtils.e("解析 JSON 数据时出错:" + e.getMessage());
|
||||
return; // 退出方法,避免后续代码执行
|
||||
}
|
||||
if (groupID.contains(mRoomId)) {
|
||||
notifyMessageReceived(event);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// 会话监听器
|
||||
if (conversationListener == null) {
|
||||
conversationListener = new V2TIMConversationListener() {
|
||||
@Override
|
||||
public void onTotalUnreadMessageCountChanged(long totalUnreadCount) {
|
||||
super.onTotalUnreadMessageCountChanged(totalUnreadCount);
|
||||
|
||||
UnreadCountEvent event = CommonAppContext.getInstance().getUnreadCountEvent();
|
||||
if (event == null) {
|
||||
event = new UnreadCountEvent();
|
||||
event.setBLong(0);
|
||||
}
|
||||
event.setALong(totalUnreadCount);
|
||||
CommonAppContext.getInstance().setUnreadCountEvent(event);
|
||||
EventBus.getDefault().post(event);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 添加所有监听器
|
||||
private void addAllListeners() {
|
||||
if (simpleMsgListener != null) {
|
||||
V2TIMManager.getInstance().addSimpleMsgListener(simpleMsgListener);
|
||||
}
|
||||
|
||||
if (v2TIMAdvancedMsgListener != null) {
|
||||
V2TIMManager.getMessageManager().addAdvancedMsgListener(v2TIMAdvancedMsgListener);
|
||||
}
|
||||
|
||||
if (groupListener != null) {
|
||||
V2TIMManager.getInstance().addGroupListener(groupListener);
|
||||
}
|
||||
|
||||
if (conversationListener != null) {
|
||||
V2TIMManager.getConversationManager().addConversationListener(conversationListener);
|
||||
}
|
||||
}
|
||||
|
||||
// 移除所有监听器
|
||||
private static void removeAllListeners() {
|
||||
if (instance != null) {
|
||||
if (instance.simpleMsgListener != null) {
|
||||
V2TIMManager.getInstance().removeSimpleMsgListener(instance.simpleMsgListener);
|
||||
}
|
||||
|
||||
if (instance.v2TIMAdvancedMsgListener != null) {
|
||||
V2TIMManager.getMessageManager().removeAdvancedMsgListener(instance.v2TIMAdvancedMsgListener);
|
||||
}
|
||||
|
||||
if (instance.groupListener != null) {
|
||||
V2TIMManager.getInstance().removeGroupListener(instance.groupListener);
|
||||
}
|
||||
|
||||
if (instance.conversationListener != null) {
|
||||
V2TIMManager.getConversationManager().removeConversationListener(instance.conversationListener);
|
||||
}
|
||||
|
||||
// instance.listenersAdded = false; // 重置标记
|
||||
}
|
||||
}
|
||||
|
||||
// 修改 quitGroup 方法
|
||||
public static void quitGroup(String mRoomId) {
|
||||
|
||||
V2TIMManager.getInstance().quitGroup("room" + mRoomId, new V2TIMCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
LogUtils.d("@@@", "退出群组成功" + mRoomId);
|
||||
// removeAllListeners(); // 移除所有监听器
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String desc) {
|
||||
LogUtils.d("@@@", "退出群组失败" + mRoomId, code, desc);
|
||||
// removeAllListeners(); // 即使失败也移除监听器
|
||||
}
|
||||
});
|
||||
|
||||
if (instance != null) {
|
||||
instance.listeners.clear();
|
||||
// removeAllListeners();
|
||||
isInitialized = false;
|
||||
groupId = null;
|
||||
LogUtils.e("@@@", "重置成功");
|
||||
}
|
||||
}
|
||||
|
||||
// 修改 reset 方法
|
||||
public static void reset(String roomId) {
|
||||
if (instance != null) {
|
||||
instance.listeners.clear();
|
||||
// removeAllListeners();
|
||||
isInitialized = false;
|
||||
groupId = null;
|
||||
// instance = null;
|
||||
quitGroup(roomId);
|
||||
LogUtils.e("@@@", "重置成功");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 确保监听器已添加
|
||||
public void ensureListenersAdded() {
|
||||
initListeners();
|
||||
addAllListeners();
|
||||
}
|
||||
|
||||
|
||||
private RoomMessageEvent parseSpecialMessageTypes(String message) {
|
||||
try {
|
||||
JsonObject jsonObject = new JsonParser().parse(message).getAsJsonObject();
|
||||
int msgType = jsonObject.get("MsgType").getAsInt();
|
||||
|
||||
if (msgType == 1053) {
|
||||
return CustomMessageParser.parseMessageType1053(jsonObject);
|
||||
} else if (msgType == 1054) {
|
||||
return CustomMessageParser.parseMessageType1054(jsonObject);
|
||||
}
|
||||
|
||||
return null; // 不是特殊类型,使用默认解析
|
||||
} catch (Exception e) {
|
||||
LogUtils.e("特殊消息解析失败: " + e.getMessage());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void addOnMessageReceivedListener(OnMessageReceivedListener listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除群组相关的监听器
|
||||
*/
|
||||
private static void removeGroupListeners() {
|
||||
if (instance != null) {
|
||||
// 移除消息监听器
|
||||
if (instance.simpleMsgListener != null) {
|
||||
V2TIMManager.getInstance().removeSimpleMsgListener(instance.simpleMsgListener);
|
||||
}
|
||||
|
||||
if (instance.v2TIMAdvancedMsgListener != null) {
|
||||
V2TIMManager.getMessageManager().removeAdvancedMsgListener(instance.v2TIMAdvancedMsgListener);
|
||||
}
|
||||
|
||||
// 移除群组监听器
|
||||
if (instance.groupListener != null) {
|
||||
V2TIMManager.getInstance().removeGroupListener(instance.groupListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void sendCustomRoomMessage(String roomId, byte[] binaryData) {
|
||||
|
||||
// 创建自定义群消息
|
||||
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
|
||||
// v2TIMMessage.setNeedReadReceipt(true);
|
||||
// 发送消息
|
||||
V2TIMManager.getMessageManager().sendMessage(
|
||||
v2TIMMessage,
|
||||
null,
|
||||
"room" + roomId,
|
||||
V2TIMMessage.V2TIM_PRIORITY_NORMAL,
|
||||
false,
|
||||
null,
|
||||
sendCallback
|
||||
);
|
||||
}
|
||||
|
||||
// TODO: 2025/11/19 添加发送公共方法,messageType:发送的type;message:发送的内容 userId:发送给谁
|
||||
public void sendCustomC2CMessage(int messageType, String message, String userId) {
|
||||
|
||||
RoomMessageEvent.T t = new RoomMessageEvent.T();
|
||||
t.setFromUserInfo(SpUtil.getUserInfo());
|
||||
t.setText(message);
|
||||
RoomMessageEvent roomMessageEvent = new RoomMessageEvent(messageType, mRoomId, t);
|
||||
String json = GsonUtils.toJson(roomMessageEvent);
|
||||
// 转换为 byte[]
|
||||
byte[] binaryData = json.getBytes(StandardCharsets.UTF_8);
|
||||
|
||||
// 创建自定义群消息
|
||||
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
|
||||
v2TIMMessage.setExcludedFromUnreadCount(true);
|
||||
v2TIMMessage.setExcludedFromContentModeration(true);
|
||||
// v2TIMMessage.setNeedReadReceipt(true);
|
||||
//
|
||||
// // 发送消息
|
||||
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "u" + userId, null, V2TIMMessage.V2TIM_PRIORITY_HIGH,
|
||||
true,
|
||||
null,
|
||||
sendCallback);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// TODO: 2025/11/19 添加发送公共方法,messageType:发送的type;message:发送的内容 userId:发送给谁
|
||||
public void sendCustomC2CMessage(int messageType, String userId,RoomMessageEvent.T text) {
|
||||
text.setFromUserInfo(SpUtil.getUserInfo());
|
||||
LogUtils.e("发送消息", "messageType:" + messageType + "\nuserId:" + userId + "\ntext:" + text,toString());
|
||||
RoomMessageEvent roomMessageEvent = new RoomMessageEvent(messageType, mRoomId, text);
|
||||
String json = GsonUtils.toJson(roomMessageEvent);
|
||||
// 转换为 byte[]
|
||||
byte[] binaryData = json.getBytes(StandardCharsets.UTF_8);
|
||||
|
||||
// 创建自定义群消息
|
||||
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
|
||||
v2TIMMessage.setExcludedFromUnreadCount(true);
|
||||
v2TIMMessage.setExcludedFromContentModeration(true);
|
||||
// v2TIMMessage.setNeedReadReceipt(true);
|
||||
//
|
||||
// // 发送消息
|
||||
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "u" + userId, null, V2TIMMessage.V2TIM_PRIORITY_HIGH,
|
||||
true,
|
||||
null,
|
||||
sendCallback);
|
||||
|
||||
}
|
||||
|
||||
public void sendCustomC2CMessage125(String userId, byte[] binaryData) {
|
||||
// 创建自定义群消息
|
||||
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(binaryData);
|
||||
v2TIMMessage.setExcludedFromUnreadCount(true);
|
||||
v2TIMMessage.setExcludedFromContentModeration(true);
|
||||
// v2TIMMessage.setNeedReadReceipt(true);
|
||||
//
|
||||
// // 发送消息
|
||||
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "u" + userId, null, V2TIMMessage.V2TIM_PRIORITY_HIGH,
|
||||
true,
|
||||
null,
|
||||
sendCallback);
|
||||
|
||||
}
|
||||
|
||||
// RoomFragment.java 中添加
|
||||
private final V2TIMSendCallback<V2TIMMessage> sendCallback = new V2TIMSendCallback<V2TIMMessage>() {
|
||||
@Override
|
||||
public void onProgress(int progress) {
|
||||
// 可选实现
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(V2TIMMessage message) {
|
||||
Log.d("MessageSender", "发送成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(int code, String desc) {
|
||||
Log.e("MessageSender", "发送失败: code=" + code + ", desc=" + desc);
|
||||
}
|
||||
};
|
||||
|
||||
private void notifyMessageReceived(RoomMessageEvent message) {
|
||||
// for (OnMessageReceivedListener listener : listeners) {
|
||||
// listener.onMessageReceived(message);
|
||||
// }
|
||||
|
||||
if ((message.getMsgType() == 1001 || message.getMsgType() == 1080) && publicScreenListeners.isEmpty()) {
|
||||
cacheMessage(message.getRoomId(), message);
|
||||
}
|
||||
|
||||
// 通知原有的监听器
|
||||
for (OnMessageReceivedListener listener : listeners) {
|
||||
listener.onMessageReceived(message);
|
||||
}
|
||||
|
||||
// 通知 PublicScreenEaseChatFragment 监听器
|
||||
for (PublicScreenMessageListener listener : publicScreenListeners) {
|
||||
listener.onPublicScreenMessageReceived(message);
|
||||
}
|
||||
}
|
||||
|
||||
public interface OnMessageReceivedListener {
|
||||
void onMessageReceived(RoomMessageEvent message);
|
||||
}
|
||||
|
||||
|
||||
public void setOnMsgTaskListener(OnMsgTaskListener listener) {
|
||||
this.onMsgTaskListener = listener;
|
||||
}
|
||||
|
||||
public interface OnMsgTaskListener {
|
||||
void onMsgTask(RoomMessageEvent message);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user