跳到主要内容

自定义信令

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

创建信令

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

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

//TODO 该类为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];
}
};
}

注册信令

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

registerMessageType 方法的 messageContentClass 参数中,我们传入新建的信令类 RoomKickOffMessage.class

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

发送信令

RCRTCRoom 中提供了 sendMessage 方法,用于发送信令。只有发送时已经成功加入房间内的用户可以接收到此信令。

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) 回调方法中处理信令。

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

以上是实现音视频房间信令消息的完整流程。如果您希望接收者不限于房间内用户,获取需要发送需要展示的聊天消息,可以使用融云的即时通讯业务。请参考即时通讯客户端文档。