自定义消息类型(旧版)
重要
本文适用于 SDK < 5.6.7 版本。如果您的 SDK 版本 ≧ 5.6.7,推荐使用新版自定义消息。
除了使用 IMLib SDK 内置消息外,还可以创建自定义消息类型。 您需要根据业务需求来选择自定义消息类型继承的消息基类:
- MessageContent:即普通类型消息内容。例如在 SDK 内置消息类型中的文本消息和位置消息。
- MediaMessageContent:即媒体类型消息。媒体类型消息内容继承自 MessageContent,并在其基础上增加了对多媒体文件的处理逻辑。在发送和接收消息时,SDK 会判断消息类型是否为多媒体类型消息,如果是多媒体类型,则会触发上传或下载多媒体文件流程。
提示
自定义消息的类型、消息结构需要确保多端一致,否则将出现无法互通的问题。
创建自定义消息
SDK 不负责定义和解析自定义消息的具体内容,您需要自行实现。
自定义消息类型的 @MessageTag(MessageTag) 决定该消息类型的唯一标识(objectname),以及是否存储、是否展示、是否计入消息未读数等属性。
-
创建一个 MessageContent 的子类。如果自定义媒体消息,需要继承 MediaMessageContent。以下示例中创建了一个
MyTextContent类:Java@MessageTag(value = "app:txtcontent", flag = MessageTag.ISCOUNTED)
public class MyTextContent extends MessageContent {
private static final String TAG = "MyTextContent";
// 自定义消息变量,可以有多个
private String content;
private MyTextContent() {}
/**
* 设置文字消息的内容。
*
* @param content 文字消息的内容。
*/
public void setContent(String content) {
this.content = content;
}
}继承自 MessageContent 或 MediaMessageContent 的子类都必须使用
@MessageTag添加消息注解。以上是一个非媒体消息的示例,其中的MessageTag指定了消息类型的唯一标识为app:txtcontent、需要在客 户端存入数据库、且需要计入未读消息数。MessageTag字段说明与详细用法参见下文如何添加消息注解。 -
重写父类的
encode方法,将MyTextContent的属性写入 JSON,转为 JSON 字符串,最后编码为字节序列(Bytes 数组)。Java/**
* 将本地消息对象序列化为消息数据。
*
* @return 消息数据。
*/
@Override
public byte[] encode() {
JSONObject jsonObj = new JSONObject();
try {
// 消息携带用户信息时, 自定义消息需添加下面代码
if (getJSONUserInfo() != null) {
jsonObj.putOpt("user", getJSONUserInfo());
}
// 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码
if (getJsonMentionInfo() != null) {
jsonObj.putOpt("mentionedInfo", getJsonMentionInfo());
}
// 将所有自定义消息的内容,都序列化至 json 对象中
jsonObj.put("content", this.content);
} catch (JSONException e) {
Log.e(TAG, "JSONException " + e.getMessage());
}
try {
return jsonObj.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "UnsupportedEncodingException ", e);
}
return null;
}