前言
在发送消息体系中,转发消息是一个重要的环节,可以单条转发也可以合并转发。本文教大家在接入环信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 messageEMCombineMessageBody body = (EMCombineMessageBody) message.getBody();msgForForward.setBody(body);}break;case IMAGE: {// send imageEMImageMessageBody body = (EMImageMessageBody) message.getBody();msgForForward.setBody(body);}break;case VIDEO: {// send imageEMVideoMessageBody body = (EMVideoMessageBody) message.getBody();msgForForward.setBody(body);}break;case FILE: {// send imageEMFileMessageBody body = (EMFileMessageBody) message.getBody();msgForForward.setBody(body);}break;case VOICE:{// send imageEMVoiceMessageBody body = (EMVoiceMessageBody) message.getBody();msgForForward.setBody(body);}break;}msgForForward.setMessageStatusCallback(new EMCallBack() {@Overridepublic void onSuccess() {EMLog.e(TAG,"=====onSuccess==");}@Overridepublic void onError(int code, String error) {EMLog.d(TAG, "===onError===code: " + code + " error: " + error);}@Overridepublic void onProgress(int progress, String status) {}});// send messageEMClient.getInstance().chatManager().sendMessage(msgForForward);
2.接收方在EMMessageListener#onMessageReceived
里接收消息;
代码如下:
EMMessageListener msgListener = new EMMessageListener() {//接收到消息@Overridepublic 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() {@Overridepublic void onSuccess() {// 消息发送成功的处理逻辑EMLog.e(TAG,"==onSuccess===");}@Overridepublic 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() {@Overridepublic void onMessageReceived(List<EMMessage> messages) {for (EMMessage emmessage:messages) {
//下载合并消息 EMClient.getInstance().chatManager().downloadAndParseCombineMessage(emmessage, new EMValueCallBack<List<EMMessage>>() {@Overridepublic void onSuccess(List<EMMessage> value) {// 处理并展示消息列表}@Overridepublic 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/