实现自定义消息收发
更新时间: 2024/07/26 13:39:23
IM UIKit 的会话消息模块(chatkit-ui
)默认实现了文本消息、图片消息等基本消息类型的发送和展示。如果这些消息类型无法满足您的业务需求,您可新增自定义消息类型。
基本消息类型
消息类型 |
显示效果 | 是否需要额外集成 |
---|---|---|
文本消息 | 否,集成会话界面即可用 | |
图片消息 | 否,集成会话界面即可用 | |
语音消息 | 否,集成会话界面即可用 | |
视频消息 | 否,集成会话界面即可用 | |
表情 | 否,集成会话界面即可用 | |
文件消息 | 否,集成会话界面即可用 | |
地理位置 | 是,见实现地理位置消息功能 |
前提条件
已集成会话消息界面。
实现流程
步骤1: 自定义消息处理
实现自定义消息收发之前,您需先自行实现消息数据的封装和相关解析规则。IM UIKit 可按照您实现的封装和解析规则对消息进行处理,将消息返回给您的应用。
-
创建自定义
Attachment
,需要继承CustomAttachment
,并重写数据解析方法(parse
)数据封装方法(packData
)以及序列化方法(toJsonStr
)。这里假设自定义
Attachment
为CustomerSampleAttachment
进行说明:-
创建
CustomerSampleAttachment
类。 -
将您的自定义消息处理逻辑添加到
CustomerSampleAttachment
类,主要包括数据解析方法parse
和数据封装方法packData
。前者将收到的消息进行解析,后者将数据进行封装用于发送。java
public class CustomerSampleAttachment extends CustomAttachment{ //自定义消息解析之后的值,本例代表自定义消息只有一个String类型的值 private String custmoerText; //声明构造方法,这里面需要调用父类方法,并传入int值作为消息类型,自定义消息类型推荐从1000开始 GuessAttachment() { super(1002); } //重写数据解析方法,这里面数据以JSONObject格式进行传输,所以您可以制定自己的数据格式。 //这个示例表示,自定义数据格式为{"customer_message_key":"我是一个自定义消息"} @Override protected void parseData(JSONObject data) { //todo 从接收到的消息内容中解析您的数据 try { this.custmoerText = data.getString("customer_message_key"); }catch (Exception exception){ } } //重写数据封装方法,将您需要传递的内容转换为JSONObject格式进行传输,所以您可以制定自己的数据格式。 //这个示例表示,把属性custmoerText的内容转换为JSONObject,用于消息发送过程中的传递 @Override protected JSONObject packData() { //将消息进行封装即可 JSONObject data = new JSONObject(); try { data.put("customer_message_key", custmoerText); }catch (Exception exception){} return data; } public void setData(String data){ this.custmoerText = data; } //设置自定义消息的信息摘要,在会话列表中根据该方法返回进行展示 @Override public String getContent() { return "..."; } //通过序列化后的String 放到消息的Attachment中传输 @NonNull @Override public String toJsonStr() { try { JSONObject map = new JSONObject(); map.put("type", "your type"); map.put("data", packData()); return map.toString(); } catch (Exception e) { e.printStackTrace(); return ""; } } }
-
-
在消息数据处理逻辑中,增加自定义消息的映射关系。所有自定义消息都会在
ChatCustomMsgFactory
中进行分发,SDK 将确定您的自定义消息是采用哪个CustomAttachment
进行处理。在
ChatKit-UI
中,我们已经创建了ChatCustomMsgFactory
,专门用于自定义消息的处理。您只需要添加您自定义消息的映射关系即可。
示例代码如下:
java
ChatKitClient.addCustomAttach(1002, CustomerSampleAttachment.class);
您注册的自定义消息解析器,只有您接入
ChatRepo
收发消息的时候才会自动解析,在SDK 的V2NIMMessage
的V2NIMMessageAttachment
只提供Json字符串 至此,您已经完成了自定义消息的处理逻辑。如果您获取的消息为该自定义消息类型,就能从IMMessageInfo
中获取到CustomerSampleAttachment
对象值。
步骤2: 实现自定义消息的 UI 展示
如果需要在会话界面将您的自定义消息按照您自定义的 UI 样式进行展示,那么需要完成如下步骤。
-
添加消息展示的
ViewHolder
,并使其继承NormalChatBaseMessageViewHolder
(基础版)。也可参考ChatTextMessageViewHolder
、ChatImageMessageViewHolder
等中已实现的代码逻辑。若集成了通用版 UI 组件,需要使其继承
FunChatBaseMessageViewHolder
(通用版)。也可参考FunChatTextMessageViewHolder
、FunChatImageMessageViewHolder
等中已实现的代码逻辑。java
public class CustomerSampleViewHolder extends NormalChatBaseMessageViewHolder { private final static String TAG = "ChatStickerViewHolder"; private CustomerSampleViewBinding binding;//创建自己的layout布局 public CustomerSampleViewHolder(@NonNull ChatBaseMessageViewHolderBinding parent, int viewType) { super(parent, viewType); } @Override public void addViewToMessageContainer() { binding = CustomerSampleViewBinding.inflate(LayoutInflater.from(parent.getContext()), getContainer(),true); } @Override public void bindData(ChatMessageBean message, ChatMessageBean lastMessage) { super.bindData(message, lastMessage); currentMessage = message; CustomerSampleAttachment attachment = (CustomerSampleAttachment) message.getMessageData().getAttachment(); if (attachment == null) { return; } //todo 设置ViewHolder展示UI的内容 } }
-
将
CustomerSampleViewHolder
添加到 IM UIkit,使 IM UIKit 在加载后能够运行您的自定义消息相关代码逻辑。java
ChatKitClient.addCustomViewHolder(1002, CustomerSampleViewHolder.class);
步骤3: 实现自定义消息收发
通过 IM UIKit 实现自定义消息收发的流程如下:
-
调用
createCustomMessage
方法创建自定义消息。java
CustomerSampleAttachment customerAttachment = new CustomerSampleAttachment(); //设置自己的Attachment中的数据 customerAttachment.setData("your data"); String attachStr = customerAttachment.toJsonStr() //创建V2NIMMessage,用于发送,content 代表内容,attachStr 代表序列化后的附件 V2NIMMessage customMsg = V2NIMMessageCreator.createCustomMessage(content, attachStr);
-
调用
ChatRepo.sendMessage
方法发送消息。IM UIKit 中的实现详见
ChatBaseViewModel
中sendCustomMessage()
方法。java
//ChaRepo提供的发送消息接口,任何消息类型都可以使用该接口进行发送 //customMessage 表示创建的消息体,conversationId表示发送给对方的会话ID,可以由用户/群组 ID和type生成,params 为配置参数,callback表示消息发送回调 ChatRepo.sendMessage(customMessage, conversationId, params,callback);
-
接收方接收消息。
IM UIKit 中已经实现该接收逻辑,详见
ChatBaseViewModel
中addListener()
方法和messageListener
对象值。java
private final NEChatListener messageListener = new NEChatListener() { // 接收到新消息 @Override public void onReceiveMessages(@NonNull List<IMMessageInfo> messages) { //处理收到的消息 } }; //注册消息接收监听 ChatRepo.addMessageListener(messageListener);
后续步骤
如果需要在会话界面添加发送自定义消息的 UI 控件,可在点击【更多】按钮(见下图)后展示的区域增加相应的按钮。具体实现方式可参考在【更多】区域增加按钮。