实现聊天消息
更新时间: 2022/11/04 10:02:17
为了提升主唱和观众之间的互动性,您可以增加文字聊天和礼物发送的功能。本文介绍如何通过 IM 的聊天室实现消息收发。
详细的说明请参见聊天室消息收发。
1. 登录 IM
调用 login
接口登录 IM,详细的登录方法请参见 登录管理 。
手动登录 IM 的示例代码如下:
LoginInfo loginInfo = LoginInfo.LoginInfoBuilder.loginInfoDefault(account, token).build();
NIMClient.getService(AuthService.class).login(loginInfo).setCallback(new RequestCallback<LoginInfo>() {
@Override
public void onSuccess(LoginInfo result) {
Log.i("NIM", "login onSuccess");
}
@Override
public void onFailed(int code) {
Log.i("NIM", "login onFailed, code is " + code);
}
@Override
public void onException(Throwable exception) {
Log.i("NIM", "login onException, " + exception);
}
});
2. 进入聊天室
用户要在聊天室收发消息,必须调用 enterChatRoomEx
接口先进入聊天室。聊天室只允许用户手动进入,无法进行邀请。
通过非独立模式(先登录 IM,再进入聊天室)进入聊天室的示例代码如下:
EnterChatRoomData data = new EnterChatRoomData(roomId);
NIMClient.getService(ChatRoomService.class).enterChatRoomEx(data, RETRY_COUNT).setCallback(new RequestCallback<EnterChatRoomResultData>() {
@Override
public void onSuccess(EnterChatRoomResultData result) {
Log.i("NIM", "enterChatRoomEx onSuccess");
}
@Override
public void onFailed(int code) {
Log.i("NIM", "enterChatRoomEx onFailed, code is " + code);
}
@Override
public void onException(Throwable exception) {
Log.i("NIM", "enterChatRoomEx onException, " + exception);
}
});
3. 发送和接收文字聊天消息
主唱和观众之间通过聊天室消息实现文字聊天功能。
实现流程
- 调用
ChatRoomServiceObserver
的observeReceiveMessage
接口注册消息接收的监听。 - 调用
observeMsgStatus
接口,注册消息状态变化的监听。 - 调用
ChatRoomMessageBuilder.createChatRoomTextMessage
接口创建消息对象。 - 发送端调用
ChatRoomService
的sendMessage
接口发送文字消息。 - 收到文本消息。
示例代码
以下示例代码展示如何实现发送和接收文字聊天消息。
// 声明与初始化接收消息监听对象
Observer<List<ChatRoomMessage>> receiveMessageObserver = new Observer<List<ChatRoomMessage>>() {
@Override
public void onEvent(List<ChatRoomMessage> chatRoomMessages) {
Log.i("NIM", "received messages");
}
};
// 声明与初始化消息状态变更监听对象
Observer<ChatRoomMessage> messageStatusObserver = new Observer<ChatRoomMessage>() {
@Override
public void onEvent(ChatRoomMessage chatRoomMessage) {
Log.i("NIM", "message on status: " + chatRoomMessage.getStatus().name());
}
};
//建议适时注销监听,如在onCreate中注册,在onDestroy中注销
NIMClient.getService(ChatRoomServiceObserver.class).observeReceiveMessage(receiveMessageObserver, true);
NIMClient.getService(ChatRoomServiceObserver.class).observeMsgStatus(messageStatusObserver, true);
ChatRoomMessage chatRoomMessage = ChatRoomMessageBuilder.createChatRoomTextMessage(roomId, text);
NIMClient.getService(ChatRoomService.class).sendMessage(chatRoomMessage, false).setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void result) {
Log.i("NIM", "sendMessage onSuccess");
}
@Override
public void onFailed(int code) {
Log.i("NIM", "sendMessage onFailed, code is " + code);
}
@Override
public void onException(Throwable exception) {
Log.i("NIM", "sendMessage onException, " + exception);
}
});
4. 发送和接收礼物
观众在房间内可以发送礼物给主唱或合唱者,可通过发送自定义的消息来实现。发送端需要在自定义消息中携带礼物 ID,其他端在接收到礼物消息后解析出礼物 ID,并播放对应动效。
-
发送礼物。
发送端通过业务服务器,调用 IM 服务端的 API(chatroom/sendMsg.action)发送礼物,调用时将业务参数
highPriority
设置为true
,从而将该自定义消息设置为高优先级消息。详情请参见发送聊天室消息 。为了避免礼物消息数量过多超过高优消息每秒上限,建议自行开发如下两个方案,并将两者组合使用:
方案说明 方案一 根据礼物的级别分配不同的策略。例如:普通礼物每秒 5 条,高级礼物每秒 5 条,同时高级礼物没用完的条数配额可以分给普通礼物。 方案二 如普通礼物数量较多,则将多个普通礼物合并到一条消息中发送。如果数量太多,合并的普通礼物消息数量也超过了每秒上限,则丢弃部分普通礼物消息的发送。因为在礼物数量很大的情况下,用户不会在意普通礼物展示是否少量丢失。 -
接收礼物。
接收礼物的实现方法和接收聊天消息的实现一样,示例代码如下:
Observer<List<ChatRoomMessage>> receiveMessageObserver = new Observer<List<ChatRoomMessage>>() { @Override public void onEvent(List<ChatRoomMessage> chatRoomMessages) { Log.i("NIM", "received messages"); } }; //建议适时注销监听,如在onCreate中注册,在onDestroy中注销 NIMClient.getService(ChatRoomServiceObserver.class).observeReceiveMessage(receiveMessageObserver, true);
5. 离开聊天室
用户调用 exitChatRoom
接口离开聊天室。离开聊天室后,会断开聊天室对应的链接,不再收到该聊天室的任何消息。
该接口没有回调。
离开聊天室的示例代码如下:
NIMClient.getService(ChatRoomService.class).exitChatRoom(roomId);
此文档是否对你有帮助?