实现自定义消息收发

更新时间: 2024/03/15 18:26:20

IM UIKit 的会话消息模块(chatkit-ui)默认实现了文本消息、图片消息等基本消息类型的发送和展示。如果这些消息类型无法满足您的业务需求,您可新增自定义消息类型

基本消息类型

消息类型
显示效果 是否需要额外集成
文本消息 否,集成会话界面即可用
图片消息 否,集成会话界面即可用
语音消息 否,集成会话界面即可用
视频消息 否,集成会话界面即可用
表情 否,集成会话界面即可用
文件消息 否,集成会话界面即可用
地理位置 是,见实现地理位置消息功能

前提条件

集成会话消息界面

实现流程

步骤1: 自定义消息处理

实现自定义消息收发之前,您需先自行实现消息数据的封装和相关解析规则。IM UIKit 可按照您实现的封装和解析规则对消息进行处理,将消息返回给您的应用。

  1. 创建自定义Attachment,需要继承CustomAttachment,并重写数据解析方法(parse)和数据封装方法(packData)。

    这里假设自定义AttachmentCustomerSampleAttachment进行说明:

    1. 创建CustomerSampleAttachment类。

    2. 将您的自定义消息处理逻辑添加到CustomerSampleAttachment类,主要包括数据解析方法parse和数据封装方法packData。前者将收到的消息进行解析,后者将数据进行封装用于发送。

      javapublic 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 "...";
          }
      
      }
      
  2. 在消息数据处理逻辑中,增加自定义消息的映射关系。所有自定义消息都会在CustomAttachParser中进行分发,SDK 将确定您的自定义消息是采用哪个CustomAttachment进行处理。

    ChatKit-UI中,我们已经创建了CustomAttachParser,专门用于自定义消息的处理。您只需要添加您自定义消息的映射关系即可。


    示例代码如下:

    javaChatKitClient.addCustomAttach(1002, CustomerSampleAttachment.class);
    

    至此,您已经完成了自定义消息的处理逻辑。如果您获取的消息为该自定义消息类型,就能从IMMessage中获取到CustomerSampleAttachment对象值。

步骤2: 实现自定义消息的 UI 展示

如果需要在会话界面将您的自定义消息按照您自定义的 UI 样式进行展示,那么需要完成如下步骤。

  1. 添加消息展示的 ViewHolder,并使其继承 NormalChatBaseMessageViewHolder(基础版)。也可参考ChatTextMessageViewHolderChatImageMessageViewHolder等中已实现的代码逻辑。

    若集成了通用版 UI 组件,需要使其继承 FunChatBaseMessageViewHolder(通用版)。也可参考FunChatTextMessageViewHolderFunChatImageMessageViewHolder等中已实现的代码逻辑。

    javapublic 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().getMessage().getAttachment();
            if (attachment == null) {
                return;
            }
            //todo 设置ViewHolder展示UI的内容
        }
    }
    
  2. CustomerSampleViewHolder添加到 IM UIkit,使 IM UIKit 在加载后能够运行您的自定义消息相关代码逻辑。

    javaChatKitClient.addCustomViewHolder(1002, CustomerSampleViewHolder.class);
    
    

步骤3: 实现自定义消息收发

通过 IM UIKit 实现自定义消息收发的流程如下:

  1. 调用createCustomMessage方法创建自定义消息。

    java    CustomerSampleAttachment customerAttachment = new CustomerSampleAttachment();
        customerAttachment.setData("这是一条自定义消息");
        //创建IMMessage,其中sessionId代表会话ID,sessionType会话类型,content代表消息内容,customerAttachment自定义消息
        IMMessage customMessage = MessageBuilder.createCustomMessage(sessionId, sessionType, content, customerAttachment);
    
  2. 调用ChatRepo.sendMessage方法发送消息。

    IM UIKit 中的实现详见ChatBaseViewModelsendCustomMessage()方法。

    java//ChaRepo提供的发送消息接口,任何消息类型都可以使用该接口进行发送
    //customMessage 表示创建的消息体。如果需要在消息发送失败后重发,标记resend参数为true,否则填false。callback表示消息发送回调
    ChatRepo.sendMessage(customMessage, resend, callback);
    
    
  3. 接收方接收消息。

    IM UIKit 中已经实现该接收逻辑,详见ChatBaseViewModelregisterObservers()方法和receiveMessageObserver对象值。

    javaprivate final EventObserver<List<IMMessageInfo>> receiveMessageObserver = new EventObserver<List<IMMessageInfo>>() {
            @Override
            public void onEvent(@Nullable List<IMMessageInfo> event) {
                //接收消息处理
            }
        };
    
        //注册消息接收监听,sessionId会话ID,receiveMessageObserver监听器,register true代表注册,false取消注册
        ChatObserverRepo.observeReceiveMessage(sessionId, receiveMessageObserver, register);
    
    

后续步骤

如果需要在会话界面添加发送自定义消息的 UI 控件,可在点击【更多】按钮(见下图)后展示的区域增加相应的按钮。具体实现方式可参考在【更多】区域增加按钮

image
此文档是否对你有帮助?
有帮助
去反馈
  • 基本消息类型
  • 前提条件
  • 实现流程
  • 步骤1: 自定义消息处理
  • 步骤2: 实现自定义消息的 UI 展示
  • 步骤3: 实现自定义消息收发
  • 后续步骤