环信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 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);


注意事项 :

  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() {
            @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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python实现猜数字游戏:一次编程旅程

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

融合创新!全局注意力+局部注意力,训练成本直降91.6%

全局注意力结合局部注意力可以让模型在处理数据时&#xff0c;既不会丢失重要的局部细节&#xff0c;也能考虑到整个数据集中的全局结构&#xff0c;从而在保持模型计算效率的同时&#xff0c;提高模型的表达能力。 这种策略相较于传统的单一注意力机制&#xff0c;能够更全面…

通用指南-营销和设计中的增强现实(AR)

原文作者&#xff1a;Superside 翻译&#xff1a;数字化营销工兵 --- 经典万字长文&#xff0c;权威解读&#xff0c;分享经典&#xff0c;预计阅读完需要30分钟&#xff0c;建议收藏&#xff01; 目录 一、引言 为什么要尝试AR AR到底是什么&#xff1f;营销人员和创意人…

巨控NET400网关:工业通讯的未来之门

描述&#xff1a;在数字化时代&#xff0c;工业通讯作为智能制造的核心&#xff0c;承载着数据交换、设备控制等关键任务。巨控NET400以其独特的优势&#xff0c;为各行各业的智能转型提供了强大的技术支持。本文深入探讨NET400的核心功能与主要优势&#xff0c;展望其在工业通…

T1 神奇苹果桶 (25分) - 小米前端笔试编程题解

考试平台&#xff1a; 赛码 题目类型&#xff1a; 20道选择 2道编程题 考试时间&#xff1a; 2024-03-23 &#xff08;两小时&#xff09; 题目描述 小希在森林冒险的时候发现一个神奇的木桶&#xff0c;某些时会凭空出现一些苹果&#xff0c;小希很解地大家分享了这一个神奇…

Markdown 编辑器使用

CSDN 在博客开头加上 [TOC](你的目录标题)就可以根据博客内容自动生成如下所示的目录&#xff1a; 你的目录标题 Markdown 编辑器功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表无序列表…

1.java openCV4.x 入门-环境搭建

专栏简介 &#x1f492;个人主页 &#x1f4d6;心灵鸡汤&#x1f4d6;大家 &#x1f4f0;专栏目录 点击上方查看更多内容 环境搭建 一、开发环境二、环境搭建1.openCV安装1.下载程序包 2.程序包安装3.搭建项目 三、非必要资源1.扩展库2.cmake 一、开发环境 开发工具 i…

structured bindings is supported from c++17

完整示例&#xff1a; #include <iostream> #include <format> #include <iomanip>void test_00(){struct Box{int width_;int height_;std::string name_;};Box box{3,4,"amazing"};auto [w, h, name]{box};//auto [w, h, name] box;std::cout …

openwrt在校园网环境下开启nat6 (ipv6 nat)

如果将路由器接入校园网&#xff0c;我们只能获得一个128位掩码的ipv6地址。这个地址仅供路由器本身使用&#xff0c;而路由器后的设备无法获取到ipv6地址&#xff0c;因此我们可以利用网络地址转换&#xff08;NAT&#xff09;为这些设备分配本地ipv6地址。 下面是openwrt开启…

TSINGSEE青犀推出县域治理视频基座数字化、智慧化解决方案

一、方案背景 县域治理方案是我国地方治理体系的重要组成部分&#xff0c;对于促进县域经济社会发展、维护社会稳定、推进全面深化改革具有重要意义。随着科技的不断进步&#xff0c;视频监管已经成为了现代社会治理的重要手段之一。县域治理视频监管方案是通过视频监控、数据…

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

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

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…

Laravel扩展包的开发

扩展包的开发 1. 创建一个新项目&#xff0c;初始化扩展包配置 首先创建一个全新的Laravel项目&#xff1a; composer create-project --prefer-dist laravel/laravel laravelPkg 接下来&#xff0c;在项目中创建目录package/{your_name}/{your_package_name} mkdir -p pa…

STM32硬件I2C通信外设

文章目录 前言I2C硬件介绍10 位地址模式硬件I2C的引脚定义I2C框图主机发送序列图主机接收序列图 硬件I2C读写MPU6050总结 前言 本文主要介绍stm32自带的I2C通信外设&#xff0c;对比与软件模拟I2C&#xff0c;硬件I2C可以自动生成时序&#xff0c;时序的操作更加及时规范&…

什么是网页抓取 Web Scraping?如何进行网页抓取?

现在&#xff0c;不论是个人开发者还是庞大的企业都需要从互联网抓取大量数据&#xff0c;而网页抓取&#xff08;Web Scraping&#xff09;技术正是获取互联网上无尽信息宝库的一把钥匙。通过网页抓取工具&#xff0c;我们可以快速收集产品价格、市场趋势、用户评论等关键数据…

uniapp h5 touch事件踩坑记录

场景&#xff1a;悬浮球功能 当我给悬浮球设置了 position: fixed; 然后监听悬浮球的touch事件&#xff0c;从事件对象中拿到clientY和clientX赋值给悬浮球的left和top属性。当直接赋值后效果应该是这样子&#xff1a; 注意鼠标相对悬浮球的位置&#xff0c;应该就是左上角&a…

力扣_876_ 链表的中间结点(c语言)

题目描述&#xff1a; 解题方法&#xff1a; struct ListNode* middleNode(struct ListNode* head) {struct ListNode* l1,*l2;l1l2head;while(l2&&l2->next){l1l1->next;l2l2->next->next;}return l1; }

element UI季度选择器的实现

效果展示 用elementUI的select实现季度选择器 代码实现 generateQuarterOption放在methods中&#xff0c;需要近几年的只需要修改第一个循环的次数即可&#xff0c;mounted生命周期函数中调用generateQuarterOption() generateQuarterOption() {//近3年所有季度let now ne…

6行代码,1行命令!轻松实现多模态(视觉)模型离线推理 在线服务

早在去年年底&#xff0c;LMDeploy 已经悄悄地支持了多模态&#xff08;视觉&#xff09;模型&#xff08;下文简称 VLM&#xff09;推理&#xff0c;只不过它静静地躺在仓库的 examples/vl 角落里&#xff0c;未曾与大家正式照面。 LMDeploy 开源链接&#xff1a; https://gi…