跳到主要内容

自定义信令

您可以根据业务需求创建自定义信令消息。

创建信令

创建信令类需继承 MessageContent 类。请注意,消息注解(@MessageTag())中的 flag 字段必须设置为 MessageTag.STATUS(不存储、不计数的状态类消息),否则会提示参数错误。关于 MessageTag 的详细说明,请参考即时通讯文档消息介绍中的“了解消息注解”。

以下示例创建了 MessageContent 的子类 RoomKickOffMessage,作为信令类。

Java
// 示例:该类来源于 SealRTC Demo,仅供参考
@MessageTag(value = "SealRTC:KickOff", flag = MessageTag.STATUS)
public class RoomKickOffMessage extends MessageContent {

private String userId;

public RoomKickOffMessage(String id) {
this.userId = id;
}

public void setUserId(String id) {
this.userId = id;
}

public String getUserId() {
return userId;
}


public RoomKickOffMessage(byte[] data) {
try {
JSONObject jsonObject = new JSONObject(new String(data));
userId = jsonObject.getString("userId");
} catch (JSONException e) {
e.printStackTrace();
}
}

@Override
public byte[] encode() {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("userId", userId);
return jsonObject.toString().getBytes();
} catch (JSONException e) {
e.printStackTrace();
}
return new byte[0];
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(userId);
}

public RoomKickOffMessage(Parcel parcel) {
userId = parcel.readString();
}

public static final Creator<RoomKickOffMessage> CREATOR = new Creator<RoomKickOffMessage>() {
@Override
public RoomKickOffMessage createFromParcel(Parcel source) {
return new RoomKickOffMessage(source);
}

@Override
public RoomKickOffMessage[] newArray(int size) {
return new RoomKickOffMessage[size];
}
};
}

注册信令

使用前需要注册信令类,否则无法发送和接收。

registerMessageTypemessageContentClass 参数中传入新建的信令类 RoomKickOffMessage.class

Java
RongIMClient.registerMessageType(RoomKickOffMessage.class);
参数类型必填说明
messageContentClassClass<? extends MessageContent>消息内容类型,必须继承 io.rong.imlib.model.MessageContent

发送信令

RCRTCRoom 提供 sendMessage 方法用于发送信令。只有在发送时已成功加入房间的用户,才能接收到该信令。

Java
RoomKickOffMessage kickOffMessage = new RoomKickOffMessage("0001");
room.sendMessage(kickOffMessage, new IRongCallback.ISendMessageCallback() {

// 发送成功
@Override
public void onSuccess(Message message) {

}

// 发送失败
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {

}
});
参数类型必填说明
messageContentMessageContent信令基类,定义了信令对象与信令数据之间的互转方法
callbackIRongCallback.ISendMessageCallback发送结果回调

发送后,回调会返回发送成功或失败的消息体 Message。若发送失败,onError 回调中还会返回状态码 RongIMClient.ErrorCode

接收信令

将音视频房间事件监听器 IRCRTCRoomEventsListener 注册到 RCRTCRoom 对象,用于监听房间内的信令消息。

onReceiveMessage(Message) 回调方法中处理信令:

Java
@Override
public void onReceiveMessage(Message message) {
MessageContent messageContent = message.getContent();
if (messageContent instanceof RoomKickOffMessage) {
RoomKickOffMessage kickOffMessage = (RoomKickOffMessage) messageContent;
}
}

以上为在音视频房间内实现信令消息的完整流程。若希望接收者不限于房间内用户,或需要在聊天中展示可阅读的消息,请使用融云即时通讯(IM)能力,参见 IM 客户端文档。