自定义信令
您可以根据自己的业务需求创建自定义信令消息。
创建信令
创建信令类需继承 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);
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
messageContentClass | Class<? 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) {
}
});
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
messageContent | MessageContent | 是 | 信令基类, 定义了 信令对象和 信令数据之间互相转换的方法。 |
callback | IRongCallback.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;
}
}
以上是实现音视频房间信令消息的完整流程。如果您希望接收者不限于房间内用户,获取需要发送需要展示的聊天消息,可以使用融云的即时通讯业务。请参考即时通讯客户端文档。