前言
在发送消息体系中,转发消息是一个重要的环节,可以单条转发也可以合并转发。本文教大家在接入环信IM过程中如何实现单条转发,合并转发消息功能,同时举例一些容易踩坑的位置,以便大家尽快顺利的实现转发消息功能。
环信4.4.0以上(包含4.4.0)的SDK版本,附件类消息支持不下载即可转发;如果还在使用之前版本的同学,建议升级到4.4.0或是先下载到本地,再发送(本篇文章是基于4.4.0的SDK实现的)
前提条件:
- 完成环信IM SDK的初始化
- 完成发送消息的操作
功能实现:
一. 单条消息转发
1.发送方转发单条消息;
代码如下:
EMMessage.Type type = message.getType();
EMMessage msgForForward = EMMessage.createSendMessage(type);
msgForForward.setTo(toChatUsername);
switch (type) {
case TXT: {
EMTextMessageBody body = (EMTextMessageBody) message.getBody();
msgForForward.setBody(body);
}
break;
case COMBINE: {
// send combine message
EMCombineMessageBody body = (EMCombineMessageBody) message.getBody();
msgForForward.setBody(body);
}
break;
case IMAGE: {
// send image
EMImageMessageBody body = (EMImageMessageBody) message.getBody();
msgForForward.setBody(body);
}
break;
case VIDEO: {
// send image
EMVideoMessageBody body = (EMVideoMessageBody) message.getBody();
msgForForward.setBody(body);
}
break;
case FILE: {
// send image
EMFileMessageBody body = (EMFileMessageBody) message.getBody();
msgForForward.setBody(body);
}
break;
case VOICE:{
// send image
EMVoiceMessageBody body = (EMVoiceMessageBody) message.getBody();
msgForForward.setBody(body);
}
break;
}
msgForForward.setMessageStatusCallback(new EMCallBack() {
@Override
public void onSuccess() {
EMLog.e(TAG,"=====onSuccess==");
}
@Override
public void onError(int code, String error) {
EMLog.d(TAG, "===onError===code: " + code + " error: " + error);
}
@Override
public void onProgress(int progress, String status) {
}
});
// send message
EMClient.getInstance().chatManager().sendMessage(msgForForward);
2.接收方在EMMessageListener#onMessageReceived
里接收消息;
代码如下:
EMMessageListener msgListener = new EMMessageListener() {
//接收到消息
@Override
public void onMessageReceived(List<EMMessage> messages) {
}
};
//注册消息监听
EMClient.getInstance().chatManager().addMessageListener(msgListener);
注意事项 :
-
转发附件类消息报下图错误时(视频消息除外),先检查引入的环信SDK版本,这个功能需要使用4.4.0以上的SDK版本;
-
转发图片消息时,接收方收到图片后,调用EMClient.getInstance().chatManager().downloadThumbnail(message)下载本地后,对比原图模糊时,请检发送方在发送图片时,是否有压缩?
代码如下:
-
转发COMBINE消息时,遇到下图报错,请检查引入的环信SDK版本(需要使用4.4.0以上包含4.4.0的sdk版本)
二. 合并转发消息
1. 创建和发送合并消息
注:合并消息的原始消息 ID 列表。该列表最多包含 300 个消息 ID。
String title = "标题";
String summary = "合并消息的概要";
String compatibleText = "您当前的版本不支持该消息,请升级到最新版本";
EMMessage message = EMMessage.createCombinedSendMessage(title, summary, compatibleText, mlisMsgID, username);
message.setMessageStatusCallback(new EMCallBack() {
@Override
public void onSuccess() {
// 消息发送成功的处理逻辑
EMLog.e(TAG,"==onSuccess===");
}
@Override
public void onError(int code, String error) {
// 消息发送失败的处理逻辑
EMLog.e(TAG,"==onError===code:"+code+",error:"+error);
}
});
EMClient.getInstance().chatManager().sendMessage(message);
2. 解析合并消息
合并消息实际上是一种附件消息。收到合并消息后,你可以调用 downloadAndParseCombineMessage
方法下载合并消息附件并解析出原始消息列表。
EMMessageListener msgListener = new EMMessageListener() {
@Override
public void onMessageReceived(List<EMMessage> messages) {
for (EMMessage emmessage:messages) {
//下载合并消息 EMClient.getInstance().chatManager().downloadAndParseCombineMessage(emmessage, new EMValueCallBack<List<EMMessage>>() {
@Override
public void onSuccess(List<EMMessage> value) {
// 处理并展示消息列表
}
@Override
public void onError(int error, String errorMsg) {
// 处理出错信息
}
});
}
}
};
//注册消息监听
EMClient.getInstance().chatManager().addMessageListener(msgListener);
场景举例:
A给B合并转发一条消息,B收到合并消息后,再直接将合并消息转给C,这个场景,就需要按照单条消息转发场景去处理,如果出现异常的话,请先检查环信SDK版本是否是4.4.0;
错误示范:
如果你在处理如上场景时,也和下图里的处理逻辑一样的话,请删掉代码,按照单条消息转发的场景处理;
如您在集成环信IM过程中遇到其他问题,可以在文档集成页呼唤文档助理,转人工,加入环信技术支持群~
参考文档:
-
注册环信IM:https://console.easemob.com/user/register
-
环信IM集成文档:https://docs-im-beta.easemob.com/document/ios/quickstart.html
-
IMGeek社区支持:https://www.imgeek.net/