环信IM集成教程---消息转发合并转发的实现

前言

在发送消息体系中,转发消息是一个重要的环节,可以单条转发也可以合并转发。本文教大家在接入环信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);

注意事项 :

  1. 转发附件类消息报下图错误时(视频消息除外),先检查引入的环信SDK版本,这个功能需要使用4.4.0以上的SDK版本;
    在这里插入图片描述

  2. 转发图片消息时,接收方收到图片后,调用EMClient.getInstance().chatManager().downloadThumbnail(message)下载本地后,对比原图模糊时,请检发送方在发送图片时,是否有压缩?
    代码如下:
    在这里插入图片描述

  3. 转发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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/289606.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高效 CUDA 调试:将 NVIDIA Compute Sanitizer 与 NVIDIA 工具扩展结合使用并创建自定义工具

高效 CUDA 调试&#xff1a;将 NVIDIA Compute Sanitizer 与 NVIDIA 工具扩展结合使用并创建自定义工具 NVIDIA Compute Sanitizer 是一款功能强大的工具&#xff0c;可以节省您的时间和精力&#xff0c;同时提高 CUDA 应用程序的可靠性和性能。 在 CUDA 环境中调试代码既具有挑…

Exception in thread “main“ com.fasterxml.jackson.databind.JsonMappingException:

问题&#xff1a;jaskson反序列化超出最大长度 Caused by: com.fasterxml.jackson.core.exc.StreamConstraintsException: String length (5043456) exceeds the maximum length (5000000) 场景&#xff1a;前端传递过大base64 原因&#xff1a; jaskon默认已经限制了最大长…

20个超实用Python魔法方法

大家好&#xff01;今天我们要一起探索Python世界的神秘角落——那些被称为“魔法方法”的特殊成员方法。它们就像是编程中的魔法咒语&#xff0c;赋予你的类各种神奇特性&#xff0c;让你的代码更加简洁、强大且有趣味&#xff01; __init__&#xff1a;这是每个对象出生时都要…

安卓利用CameraX 拍照获这张照片的exif信息

一、首先导入相关权限 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-featureandroid:name"android.hardware.camera"android:required"true" /><uses-permission android:name"andro…

蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)

目录 一、摆花 思路一&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 思路二&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 循环遍历&#xff1a; 状态转移方程&#xff1a; 二、数字三角形加强版 一、摆花 题目描述 小明的花店新开张&#xff0c;为了吸…

Uni-app/Vue/Js本地模糊查询,匹配所有字段includes和some方法结合使用e

天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 1.第一步 需要一个数组数据 {"week": "全部","hOutName": null,"weekendPrice": null,"channel": "门市价","hOutId": 98,"cTime": "…

【Redis】Redis 内存管理,Redis事务,bigkey和hotkey

目录 Redis 内存管理 缓存数据设置过期时间&#xff1f; Redis 是如何判断数据是否过期的呢&#xff1f; 过期删除策略 内存淘汰机制 主从模式下对过期键的处理&#xff1f; LRU和LFU的区别 Redis事务 定义和原理 Redis 事务的注意点&#xff1f; 为什么不支持回滚&a…

SQLite数据库文件损坏的可能几种情况(一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 下一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 概述 SQLite数据库具有很强的抗损坏能力。如果应用程序崩溃&#xff0c…

指针数组的有趣程序【C语言】

文章目录 指针数组的有趣程序指针数组是什么&#xff1f;指针数组的魅力指针数组的应用示例&#xff1a;命令行计算器有趣的颜色打印 结语 指针数组的有趣程序 在C语言的世界里&#xff0c;指针是一种强大的工具&#xff0c;它不仅能够指向变量&#xff0c;还能指向数组&#…

HBase Shell基本操作

一、进入Hbase Shell客户端 先在Linux Shell命令行终端执行start-dfs.sh脚本启动HDFS&#xff0c;再执行start-hbase.sh脚本启动HBase。如果Linux系统已配置HBase环境变量&#xff0c;可直接在任意目录下执行hbase shell脚本命令&#xff0c;就可进入HBase Shell的命令行终端环…

Unity Mobile Notifications推送问题

1.在部分机型点击通知弹窗进不去游戏 把这里改成自己的Activity 2.推送的时候没有横幅跟icon红点 主要是第一句话 注册的时候选项可以选择 defaultNotificationChannel new AndroidNotificationChannel(“default_channel”, “Default Channel”, “For Generic notifica…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年&#xff0c;其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年&#xff0c;LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今&#xff0c;LinkedIn 在全球运营&#xff0c;拥有超过 3.5 亿会…

今日AI热点:科技前沿新动态

引言&#xff1a; 人工智能领域日新月异&#xff0c;每天都有令人振奋的新进展。从苹果到谷歌&#xff0c;从OpenAI到Meta&#xff0c;各大科技巨头纷纷推出创新产品和技术&#xff0c;不断推动着人工智能的发展。让我们一起来看看今日AI热点&#xff0c;探索这个充满活力和激情…

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…

Mac安装minio

Mac安装minio 本文介绍使用 mac 安装 MinIO。 所有软件安装优先参考官网&#xff1a;MinIO Object Storage for MacOS — MinIO Object Storage for MacOS #使用 brew 安装 minio brew install minio/stable/minio#找到 minio tong ~ $ brew list minio /opt/homebrew/Cella…

【ssh连接】奇奇怪怪报错记录

gitlab配置ssh连接&#xff0c;先跟着教程生成密钥&#xff0c;上传公钥&#xff0c;将服务器信息存入config文件&#xff0c;但是ssh连接超时&#xff0c;很急&#xff0c;想用服务器&#xff0c;各种搜索尝试&#xff0c;搞了两三天别的什么都没干&#xff0c;还是没解决&…

深度学习pytorch——激活函数损失函数(持续更新)

论生物神经元与神经网络中的神经元联系——为什么使用激活函数&#xff1f; 我们将生物体中的神经元与神经网络中的神经元共同分析。从下图可以看出神经网络中的神经元与生物体中的神经元有很多相似之处&#xff0c;由于只有刺激达到一定的程度人体才可以感受到刺激&#xff0c…

硬件6、AD设计PcbLib之引脚间如何设置距离及设置PCB元器件丝印

设置引脚间的距离 一个器件有两个引脚&#xff0c;在制作这个器件的pcblib时&#xff0c;需要设置两个引脚之间的距离 1、先选中其中一个引脚 2、然后拖动至两个引脚重叠 3、按下M键&#xff0c;通过X&#xff0c;Y移动选中对象 4、输入两个引脚中心点之间的距离 5、然后两…

【随笔】Git -- 基本概念和使用方式(五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

排序C++

题目 法1 sort升序排序&#xff0c;再逆序输出 #include<iostream> #include<algorithm> using namespace std;const int N 5e53;//注意const&#xff0c;全局 int a[N]; int main() {//错误int N5e53;//错误const int a[N];int n;cin >> n;for (int i 1;…