创建和管理聊天室

更新时间:2022-02-28

本文介绍如何创建和管理聊天室。具体消息相关内容见 消息管理

环信即时通讯 IM SDK 提供 EMChatRoomManager 类 和 EMChatRoom 类,支持聊天室的创建、获取、修改、删除等管理功能。主要方法如下:

  • fetchPublicChatRoomsFromServer 从服务器获取指定数目的聊天室;
  • createChatRoom 创建聊天室;
  • fetchChatRoomFromServer 获取聊天室实例;
  • joinChatRoom 加入聊天室;
  • leaveChatRoom 退出聊天室;
  • destroyChatRoom 解散聊天室。

开始前,请确保满足以下条件:

  • 完成 SDK 初始化,详见 快速入门
  • 了解环信即时通讯 IM 的接口使用限制,详见 使用限制
  • 了解环信即时通讯 IM 聊天室不同版本的数量限制,详见 环信即时通讯 IM 价格
  • 聊天室创建者和管理员的数量之和不能超过 100,即管理员最多可添加 99 个。

从服务器获取指定数目的聊天室

用户调用 fetchPublicChatRoomsFromServer 接口可以从服务器获取指定数目的聊天室列表,pageSize 最大值为 1,000

// Asynchronous processing is required.
EMPageResult<EMChatRoom> chatRooms = EMClient.getInstance().chatroomManager().
                            fetchPublicChatRoomsFromServer(pageNumber, pageSize);

创建聊天室

用户可以调用 createChatRoom 接口创建聊天室。

示例代码如下:

// Asynchronous processing is required.
EMChatRoom  chatRoom = EMClient.getInstance().chatroomManager().createChatRoom(subject, description, welcomMessage, maxUserCount, members);

获取聊天室实例

用户可调用 fetchChatRoomFromServer 获取聊天室的基本信息。

示例代码如下:

// Asynchronous processing is required.
EMChatRoom chatRoom = EMClient.getInstance().chatroomManager().fetchChatRoomFromServer(chatRoomId);

加入聊天室

用户可调用 joinChatRoom 进入特定聊天室。

注意

  • 聊天室所有成员都有权限调用该方法。
  • 其他成员收到通知,触发其他成员的 onMemberJoined 回调方法。

示例代码如下:

EMClient.getInstance().chatroomManager().joinChatRoom(chatRoomId, new EMValueCallBack<EMChatRoom>() {
    @Override
    public void onSuccess(EMChatRoom value) {

    }
    
    @Override
    public void onError(int error, String errorMsg) {
    
    }

});

退出聊天室

用户可以调用 leaveChatRoom 退出当前聊天室。

注意

  • 聊天室所有成员都有权限调用该方法。
  • 其他成员收到 onMemberExited 回调。

示例代码如下:

EMClient.getInstance().chatroomManager().leaveChatRoom(chatRoomId);

解散聊天室

聊天室所有者可以调用 destroyChatRoom 解散聊天室。

注意

  • 聊天室所有成员都有权限调用该方法。
  • 其它成员会收到解散通知,并且被踢出聊天室,触发其他成员的 onChatRoomDestroyed 回调方法。

示例代码如下:

// Asynchronous processing is required.
EMClient.getInstance().chatroomManager().destroyChatRoom(chatRoomId);

离开聊天室保留本地消息

离开聊天室时,SDK 默认会删除此聊天室本地所有消息,如果不想删除,可以设置 EMOptions#setDeleteMessagesAsExitChatRoomfasle

示例代码如下:

EMOptions options = new EMOptions();
options.setDeleteMessagesAsExitChatRoom(false);

设置聊天室监听

获取聊天室的变化,可以注册聊天室监听。

// 注册聊天室回调。
EMClient.getInstance().chatroomManager().addChatRoomChangeListener(chatRoomChangeListener);
// 移除聊天室回调。
EMClient.getInstance().chatroomManager().removeChatRoomListener(chatRoomChangeListener);

聊天室监听方法

public interface EMChatRoomChangeListener {
    /**
     * 聊天室被解散。
     * 
     * @param roomId        聊天室 ID。
     * @param roomName      聊天室名称。
     *
     */
    void onChatRoomDestroyed(final String roomId, final String roomName);

    /**
     * 聊天室加入新成员事件。
     * 
     * @param roomId        聊天室 ID。
     * @param participant   新成员 username。
     *
     */
    void onMemberJoined(final String roomId, final String participant);
    
    /**
     * 聊天室成员主动退出事件。
     * 
     * @param roomId        聊天室 ID。
     * @param roomName      聊天室名称。
     * @param participant   退出的成员 ID。
     *
      */
    void onMemberExited(final String roomId, final String roomName, final String participant);
    
    /**
     * 聊天室人员被移除。
     *
     * @param reason        用户被移出聊天室的原因:
     *                        - xxx BE_KICKED:该用户被聊天室管理员移除;
     *                        - xxxBE_LICKED)FOR_OFFLINE:该用户由于当前设备断网被服务器移出聊天室。
     * 
     * @param roomId        聊天室 ID。
     * @param roomName      聊天室名称。
     * @param participant   被移除人员 ID。
     *
     */
    void onRemovedFromChatRoom(final int reason, final String roomId, final String roomName, final String participant);
    
    /**
     * 有成员被禁言。
     * 禁言期间成员不能发送发消息。
     *
     * @param chatRoomId    聊天室 ID。
     * @param mutes         禁言的成员。
     * @param expireTime    禁言有效期,单位为毫秒。
     *
     */
    void onMuteListAdded(final String chatRoomId, final List<String> mutes, final long expireTime);
    
    /**
     * 有成员从禁言列表中移除。
     *
     * @param chatRoomId    聊天室 ID。
     * @param mutes         移出禁言列表的成员名单。
     *
     */
    void onMuteListRemoved(final String chatRoomId, final List<String> mutes);
    
    /**
     * 白名单成员增加。
     *
     * @param chatRoomId    聊天室 ID。
     * @param whitelist     白名单中增加的成员名单。
     *
     */
    void onWhiteListAdded(final String chatRoomId, final List<String> whitelist);
    
    /**
     * 白名单成员减少。
     *
     * @param chatRoomId    聊天室 ID。
     * @param whitelist     白名单中移除的成员名单。
     *
     */
    void onWhiteListRemoved(final String chatRoomId, final List<String> whitelist);
    
    /**
     * 全员禁言状态的变化。
     *
     * @param chatRoomId    聊天室 ID。
     * @param isMuted       是否开启了全员禁言。
     *
     */
    void onAllMemberMuteStateChanged(final String chatRoomId, final boolean isMuted);
    
    /**
     * 有成员设为管理员权限。
     *
     * @param chatRoomId    聊天室 ID。
     * @param admin         设为管理员的成员。
     *
     */
    void onAdminAdded(final String chatRoomId, final String admin);
    
    /**
     * 移除管理员权限。
     *
     * @param  chatRoomId   聊天室 ID。
     * @param  admin        被移除的管理员。
     *
     */
    void onAdminRemoved(final String chatRoomId, final String admin);
    
    /**
     * 转移聊天室所有者。
     *
     * @param chatRoomId    聊天室 ID。
     * @param newOwner      新所有者。
     * @param oldOwner      原聊天室所有者。
     *
     */
    void onOwnerChanged(final String chatRoomId, final String newOwner, final String oldOwner);


    /**
     * 聊天室公告更新事件。
     * @param chatRoomId    聊天室 ID。
     * @param announcement  更新的公告内容。
     *
     */
    void onAnnouncementChanged(String chatRoomId, String announcement);

}