SDK 文档

服务端 API

自定义消息 (Android)

最近更新时间:2021-10-15 14:25:47

TUIKit 已经在内部完成了基本消息的渲染工作,您可以很简单地通过属性设置来调节消息展示样式,也可以重新自定义消息样式。

基本消息类型

TUIKit 基本消息类型请参见 MessageInfo.java

消息类型 显示效果图
文本类消息
图片类消息
语音类消息
视频类消息
文件类消息

自定义消息

  • 如果基本消息类型不能满足您的需求,您可以根据实际业务需求自定义消息。
  • 本文以发送一条可跳转至浏览器的超文本作为自定义消息为例,帮助您快速了解实现流程。本文以 5.7.1435 版本为例,与之前版本有所不同。

自定义欢迎消息显示效果

在消息列表中显示自定义欢迎消息

在会话列表中显示自定义欢迎消息的消息摘要

实现自定义消息

步骤1:解析自定义消息

MessageInfo.java 用来存储要在消息列表中渲染的消息数据。ChatMessageInfoUtil.java 用来把 V2TIMMessage 解析为 MessageInfo
收到自定义消息之后,在 ChatMessageInfoUtil.javacreateCustomMessageInfo 方法中进行解析:

...

V2TIMCustomElem customElem = timMessage.getCustomElem();
if (customElem == null || customElem.getData() == null) {
    return null;
}
String data = new String(customElem.getData());

Gson gson = new Gson();
HashMap customJsonMap = null;
try {
    customJsonMap = gson.fromJson(data, HashMap.class);
} catch (JsonSyntaxException e) {
    TUIChatLog.e(TAG, " getCustomJsonMap error ");
}
String businessId = null;
if (customJsonMap != null) {
    businessIdObj = customJsonMap.get(TUIConstants.Message.CUSTOM_BUSINESS_ID_KEY);
}
if (businessIdObj instanceof String) {
    businessId = (String) businessIdObj;
}
// 欢迎消息
if (TextUtils.equals(businessId, "text_link")) {
    msgInfo.setMsgType(MessageInfo.MSG_TYPE_CUSTOM);
    msgInfo.setExtra(customJsonMap.get("text"));
}

...

步骤2:在消息列表中渲染自定义消息

MessageCustomHolder.java 用来渲染各种自定义消息。收到自定义消息之后,MessageCustomHolder.java 根据解析出的 MessageInfolayoutViews 方法中进行自定义消息的渲染:

...

String data = new String(msg.getCustomElemData());
Gson gson = new Gson();
HashMap customJsonMap = null;
try {
    customJsonMap = gson.fromJson(data, HashMap.class);
} catch (JsonSyntaxException e) {
    TUIChatLog.e("MessageCustomHolder", " getCustomJsonMap error ");
}
String businessId = null;
Object businessIdObj = null;
if (customJsonMap != null) {
    businessIdObj = customJsonMap.get(TUIConstants.Message.CUSTOM_BUSINESS_ID_KEY);
}
if (businessIdObj instanceof String) {
    businessId = (String) businessIdObj;
}

// 渲染欢迎消息
if (TextUtils.equals(businessId, TUIChatConstants.BUSINESS_ID_CUSTOM_HELLO)) {
    drawCustomHelloMessage(msg, position);
} 

...

步骤3: 在会话列表中渲染自定义消息

ConversationMessageInfo.java 用来存储要在会话列表中渲染的消息数据。
ConversationMessageInfoUtil.java 用来把 V2TIMMessage 解析为 ConversationMessageInfo
收到自定义消息之后,在 ConversationMessageInfoUtil.javacreateCustomMessageInfo 方法中进行解析:

// 欢迎消息
if (TextUtils.equals(businessId, "text_link")) {
    msgInfo.setMsgType(MessageInfo.MSG_TYPE_CUSTOM);
    msgInfo.setExtra(customJsonMap.get("text"));
}

发送自定义消息

ChatLayoutSetting.java 用来设置聊天界面的控件和样式,在 ChatLayoutSetting.javacustomizeChatLayout 方法中添加以下代码,用来添加自定义消息发送按钮和发送按钮点击后的发送消息事件:

InputMoreActionUnit unit = new InputMoreActionUnit() {};
unit.setIconResId(R.drawable.custom);
unit.setTitleId(R.string.test_custom_action);
unit.setActionId(CustomHelloMessage.CUSTOM_HELLO_ACTION_ID);
unit.setPriority(10);
unit.setOnClickListener(unit.new OnActionClickListener() {
   @Override
   public void onClick() {
       CustomHelloMessage customHelloMessage = new CustomHelloMessage();
       customHelloMessage.version = TUIChatConstants.version;
       Gson gson = new Gson();
       String data = gson.toJson(customHelloMessage);
       MessageInfo info = ChatMessageInfoUtil.buildCustomMessage(data, customHelloMessage.text, customHelloMessage.text.getBytes());
       layout.sendMessage(info, false);
   }
});
inputView.addAction(unit);
// 消息内容为
// data = {"businessID":"text_link","link":"https://cloud.tencent.com/document/product/269/3794","text":"欢迎加入云通信IM大家庭!","version":4}

目录