当前位置: 代码迷 >> 综合 >> 融云消息自定义
  详细解决方案

融云消息自定义

热度:87   发布时间:2023-10-19 07:42:57.0

1、继承 MessageContent

新建一自定义消息类,继承 MessageContent 如下面示例代码:

public class CustomizeMessage extends MessageContent {private String content;//消息属性,可随意定义}

2、重写和实现方法

实现 encode() 方法,该方法的功能是将消息属性封装成 json 串,再将 json 串转成 byte 数组,该方法会在发消息时调用,如下面示例代码:

@Override
public byte[] encode() {JSONObject jsonObj = new JSONObject();try {jsonObj.put("content", "这是一条消息内容");} catch (JSONException e) {Log.e("JSONException", e.getMessage());}try {return jsonObj.toString().getBytes("UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return null;
}

覆盖父类的 MessageContent(byte[] data) 构造方法,该方法将对收到的消息进行解析,先由 byte 转成 json 字符串,再将 json 中内容取出赋值给消息属性。

public CustomizeMessage(byte[] data) {String jsonStr = null;try {jsonStr = new String(data, "UTF-8");} catch (UnsupportedEncodingException e1) {}try {JSONObject jsonObj = new JSONObject(jsonStr);if (jsonObj.has("content"))content = jsonObj.optString("content");} catch (JSONException e) {RLog.e(this, "JSONException", e.getMessage());}}

MessageContent 已实现 Parcelable 接口,下面需要实现 Parcelable 中的方法:

//给消息赋值。
public CustomizeMessage(Parcel in) {content=ParcelUtils.readFromParcel(in);//该类为工具类,消息属性...//这里可继续增加你消息的属性}/*** 读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。*/public static final Creator<CustomizeMessage> CREATOR = new Creator<CustomizeMessage>() {@Overridepublic CustomizeMessage createFromParcel(Parcel source) {return new CustomizeMessage(source);}@Overridepublic CustomizeMessage[] newArray(int size) {return new CustomizeMessage[size];}};/*** 描述了包含在 Parcelable 对象排列信息中的特殊对象的类型。** @return 一个标志位,表明Parcelable对象特殊对象类型集合的排列。*/public int describeContents() {return 0;}/*** 将类的数据写入外部提供的 Parcel 中。** @param dest  对象被写入的 Parcel。* @param flags 对象如何被写入的附加标志。*/@Overridepublic void writeToParcel(Parcel dest, int flags) {ParcelUtils.writeToParcel(dest, content);//该类为工具类,对消息中属性进行序列化...//这里可继续增加你消息的属性}

3、增加注解信息

注解名:MessageTag ;属性:value ,flag; value 即 ObjectName 是消息的唯一标识不可以重复,开发者命名时不能以 RC 开头,避免和融云内置消息冲突;flag 是用来定义消息的可操作状态。

如下面代码段,自定义消息名称 CustomizeMessage ,vaule 是 app:custom ,flag 是 MessageTag.ISCOUNTED | MessageTag.ISPERSISTED 表示消息计数且存库。

@MessageTag(value = "app:custom", flag = MessageTag.ISCOUNTED | MessageTag.ISPERSISTED)
public class CustomizeMessage extends MessageContent {...
}

flag 值如下表:

枚举值 说明
MessageTag.NONE 为空值,不表示任何意义,发送的自定义消息不会在会话页面和会话列表中展示。
MessageTag.ISCOUNTED 表示客户端收到消息后,要进行未读消息计数(未读消息数增加 1),所有内容型消息都应该设置此值。非内容类消息暂不支持消息计数。
MessageTag.ISPERSISTED 表示客户端收到消息后,要进行存储,并在之后可以通过接口查询,存储后会在会话界面中显示。

4、注册自定义消息

自定义消息应在 init 后注册,代码如下:

RongIM.registerMessageType(CustomizeMessage.class);

这些基本都是官网上的内容:

特意附上官网地址:

融云官网地址




  相关解决方案