====== 创建和管理聊天室 ======
本文介绍如何创建和管理聊天室。
===== 技术原理 =====
环信即时通讯 IM SDK 提供 ''%%EMChatRoomManager%%'' 类 和 ''%%EMChatRoom%%'' 类,支持聊天室的创建、获取、修改、删除等管理功能。主要方法如下:
* ''%%fetchPublicChatRoomsFromServer%%'' 从服务器获取指定数目的聊天室;
* ''%%createChatRoom%%'' 创建聊天室;
* ''%%fetchChatRoomFromServer%%'' 获取聊天室实例;
* ''%%joinChatRoom%%'' 加入聊天室;
* ''%%leaveChatRoom%%'' 退出聊天室;
* ''%%destroyChatRoom%%'' 解散聊天室。
===== 前提条件 =====
开始前,请确保满足以下条件:
* 完成 SDK 初始化,详见 [[ccim:android:quickstart|快速开始]]。
* 了解环信即时通讯 IM 的限制条件,详见 [[ccim:limitation|限制条件]]。
* 了解环信即时通讯 IM 聊天室不同版本的数量限制,详见 [[https://www.easemob.com/pricing/im|环信即时通讯 IM 价格]]。
* 聊天室创建者和管理员的数量之和不能超过 100 ,即管理员最多可添加 99 个。
===== 实现方法 =====
==== 从服务器获取指定数目的聊天室 ====
用户调用 ''%%fetchPublicChatRoomsFromServer%%'' 接口可以从服务器获取指定数目的聊天室列表,''%%pageSize%%'' 最大值为 ''%%1,000%%''。
// Asynchronous processing is required.
EMPageResult 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() {
@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#setDeleteMessagesAsExitChatRoom%%'' 为 ''%%fasle%%''。
示例代码如下:
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 mutes, final long expireTime);
/**
* 有成员从禁言列表中移除。
* @param chatRoomId 聊天室 ID。
* @param mutes 移出禁言列表的成员名单。
*/
void onMuteListRemoved(final String chatRoomId, final List mutes);
/**
* 白名单成员增加。
* @param chatRoomId 聊天室 ID。
* @param whitelist 白名单中增加的成员名单。
*/
void onWhiteListAdded(final String chatRoomId, final List whitelist);
/**
* 白名单成员减少。
* @param chatRoomId 聊天室 ID。
* @param whitelist 白名单中移除的成员名单。
*/
void onWhiteListRemoved(final String chatRoomId, final List 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);
}