自定义信令
您可以根据业务需求创建自定义信令消息。
创建信令
创建信令类需继承 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];
}
};
}
注册信令
使用前需要注册信令类,否则无法发送和接收。
在 registerMessageType 的 messageContentClass 参数中传入新建的信令类 RoomKickOffMessage.class。
Java
RongIMClient.registerMessageType(RoomKickOffMessage.class);
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| messageContentClass | Class<? 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) {
}
});
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| messageContent | MessageContent | 是 | 信令基类,定义了信令对象与信令数据之间的互转方法 |
| callback | IRongCallback.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 客户端文档。