创建和管理群组
更新时间:2022-02-28
群组是支持多人沟通的即时通讯系统,本文介绍如何使用环信即时通讯 IM SDK 在实时互动 app 中创建和管理群组,并实现群组相关功能。
如需查看消息相关内容,参见 消息管理。
技术原理
环信即时通讯 IM Android SDK 提供 EMGroupManager
类和 EMGroup
类,用于管理群组,其中包含如下主要方法:
createGroup
创建群组;destroyGroup
解散群组;joinGroup
加入群组;leaveGroup
退出群组;getGroupFromServer
获取群组详情;fetchGroupMembers
获取群成员列表;getJoinedGroupsFromServer
从服务器端获取已加入的群组列表;getAllGroups
从本地获取群组列表;getPublicGroupsFromServer
从服务器端获取公开群列表;blockGroupMessage
屏蔽群消息;unblockGroupMessage
取消群消息屏蔽;addGroupChangeListener
添加群组事件监听;removeGroupChangeListener
移除群组事件监听。
前提条件
新建群组
1、群组分为私有群和公开群。
私有群不可被搜索到,公开群可以通过 ID 搜索到。目前支持四种群样式(EMGroupStyle),如下:
- EMGroupStylePrivateOnlyOwnerInvite——私有群,只有群主和管理员可以邀请人;
- EMGroupStylePrivateMemberCanInvite——私有群,群成员也能邀请人进群;
- EMGroupStylePublicJoinNeedApproval——公开群,加入此群除了群主和管理员邀请,只能通过申请加入此群;
- EMGroupStylePublicOpenJoin ——公开群,任何人都能加入此群。
2、新建群组,并加入用户。群主和用户根据设置不同,会收到不同的群组事件回调。分为需要用户确认和不需要确认两种情况:
第一种:加群需要用户确认的情况。
- 用户将会收到群组回调 `EMGroupChangeListener#onInvitationReceived`;
- 用户同意加入群组后,群主会收到回调 `EMGroupChangeListener#onInvitationAccepted` 和 `EMGroupChangeListener#onMemberJoined`;其他群成员将会接收到群组事件回调 `EMGroupChangeListener#onMemberJoined`;
- 如果用户拒绝,群主会收到回调 `EMGroupChangeListener#onInvitationDeclined`。
第二种:如果不需要用户确认的情况。
- 用户将收到群组回调 `EMGroupChangeListener#onAutoAcceptInvitationFromGroup`;
- 群主将收到每个已加入成员对应的群组事件回调 `EMGroupChangeListener#onInvitationAccepted` 和 `EMGroupChangeListener#onMemberJoined`;
- 先加入的群成员会收到群组事件回调 `EMGroupChangeListener#onMemberJoined`。
3、用户加入群组后,将可以收到群消息。
示例代码如下:
EMGroupOptions option = new EMGroupOptions();
option.maxUsers = 100;
option.style = EMGroupStyle.EMGroupStylePrivateMemberCanInvite;
EMClient.getInstance().groupManager().createGroup(groupName, desc, allMembers, reason, option);
注:如果 option.inviteNeedConfirm
设置为 false
,即直接加被邀请人进群。在此情况下,被邀请人设置非自动进群是不起作用的。
解散群组
注意
该操作只能群主才能进行。 该操作是危险操作,解散群组后,将删除本地数据库及内存中的群相关信息及群会话。
示例代码如下:
//Asynchronous processing is required.
//群组解散后,群成员将会收到 `EMGroupChangeListener#onGroupDestroyed` 回调。
EMClient.getInstance().groupManager().destroyGroup(groupId);
用户申请入群
- 用户只能申请加入公开群。
- 如果公开群类型为
EMGroupStylePublicOpenJoin
时,用户直接加入群组;其他群成员会收到群组事件回调EMGroupChangeListener#onMemberJoined
。 - 如果公开群类型为
EMGroupStylePublicJoinNeedApproval
时,群主和群管理员会收到群组事件回调EMGroupChangeListener#onRequestToJoinReceived
。
接下来可以选择同意或者拒绝入群申请。
- 第一种情况:群主和群管理员同意了入群申请,申请人会收到群组事件回调
EMGroupChangeListener#onRequestToJoinAccepted
;其他群成员会收到群组事件回调EMGroupChangeListener#onMemberJoined
。 - 第二种情况:群主和群管理员拒绝了入群申请,申请人会收到群组事件回调
EMGroupChangeListener#onRequestToJoinDeclined
。
用户加群步骤如下:
1、从服务器获取公开群组列表获取到想要加入的群组 ID。
2、根据群组 ID 申请加入群组。
示例代码如下:
//Asynchronous processing is required.
EMClient.getInstance().groupManager().joinGroup(groupId);
退出群组
群成员可主动调用此方法退出群组,退出群组后,该成员将不会再收到群消息。其他成员将会收到群组事件回调 EMGroupChangeListener#onMemberExited
。
示例代码如下:
//Asynchronous processing is required.
EMClient.getInstance().groupManager().leaveGroup(groupId);
获取群组详情
获取单个群组详情有以下两种方法:
getGroupFromServer(groupId)
:从内存获取群组详情。返回结果包括:群组 ID、群组名称、群组描述、群组基本属性、群主、群组管理员列表,默认不包含群成员。
getGroupFromServer(String groupId, boolean fetchMembers)
:从服务器获取群组详情。返回结果包括:群组 ID、群组名称、群组描述、群组基本属性、群主、群组管理员列表。另外,若设置fetchMembers
为true
,获取群组详情时同时获取群成员,默认获取最大数量为 200。
//根据群组 ID 从本地获取群组详情。
EMGroup group = EMClient.getInstance().groupManager().getGroup(groupId);
//根据群组 ID 从服务器获取群组详情。
EMGroup group = EMClient.getInstance().groupManager().getGroupFromServer(groupId);
//获取群主用户 ID。
group.getOwner();
//获取内存中的群成员。
List<String> members = group.getMembers();
//获取内存中管理员列表。
List<String> adminList = group.getAdminList();
/**
* 获取是否已屏蔽群组消息。
* - `true`:是;
* - `false`:否。
*/
boolean isMsgBlocked = group.isMsgBlocked();
...
获取群成员列表
从服务器获取群成员列表,具体如下:
- 可通过分页获取群成员:
List<String> memberList = new ArrayList<>;
EMCursorResult<String> result = null;
final int pageSize = 20;
do {
result = EMClient.getInstance().groupManager().fetchGroupMembers(groupId,
result != null? result.getCursor(): "", pageSize);
memberList.addAll(result.getData());
} while (!TextUtils.isEmpty(result.getCursor()) && result.getData().size() == pageSize);
- 当群成员少于 200 人时,可通过以下方式获取群成员:
// Asynchronous processing is required.
// 第二个参数传入`true`,默认取 200 人的群成员列表。
EMGroup group = EMClient.getInstance().groupManager().getGroupFromServer(groupId, true);
List<String> memberList = group.getMembers();
获取群组列表
- 用户可以从服务器获取自己加入和创建的群组列表:
//Asynchronous processing is required.
List<EMGroup> grouplist = EMClient.getInstance().groupManager().getJoinedGroupsFromServer();
- 用户可以从本地加载本地群组列表,为了保证数据的正确性,需要先从服务器获取自己加入和创建的群组列表:
List<EMGroup> grouplist = EMClient.getInstance().groupManager().getAllGroups();
- 用户还可以分页从服务器端获取公开群组列表:
//Asynchronous processing is required.
EMCursorResult<EMGroupInfo> result = EMClient.getInstance().groupManager().getPublicGroupsFromServer(pageSize, cursor);
List<EMGroupInfo> groupsList = result.getData();
String cursor = result.getCursor();
屏蔽和解除群消息
群成员可以屏蔽群消息和解除群消息屏蔽。屏蔽群消息后,该成员将不会再接收到群消息。群主和群管理员不能进行此操作。
屏蔽群消息
EMClient.getInstance().groupManager().blockGroupMessage(groupId);
解除屏蔽群
EMClient.getInstance().groupManager().unblockGroupMessage(groupId);
检查是否已经屏蔽群消息
可以通过 EMGroup#isMsgBlocked
检查用户是否屏蔽了该群的群消息。使用此方法检查时,为了保证结果的准确性,需要先从服务器获取群详情,即调用 EMGroupManager#getGroupFromServer
。
群组事件监听
EMGroupManager
中提供群组事件的监听接口。开发者可以通过设置此监听,获取群组中的事件,并做出相应处理。如果不再使用该监听,需要移除,防止出现内存泄漏。
示例代码如下:
EMGroupChangeListener groupListener = new EMGroupChangeListener() {
@Override
public void onInvitationReceived(String groupId, String groupName, String inviter, String reason) {
}
@Override
public void onRequestToJoinReceived(String groupId, String groupName, String applicant, String reason) {
}
@Override
public void onRequestToJoinAccepted(String groupId, String groupName, String accepter) {
}
@Override
public void onRequestToJoinDeclined(String groupId, String groupName, String decliner, String reason) {
}
@Override
public void onInvitationAccepted(String groupId, String invitee, String reason) {
}
@Override
public void onInvitationDeclined(String groupId, String invitee, String reason) {
}
@Override
public void onUserRemoved(String groupId, String groupName) {
}
@Override
public void onGroupDestroyed(String groupId, String groupName) {
}
@Override
public void onAutoAcceptInvitationFromGroup(String groupId, String inviter, String inviteMessage) {
}
@Override
public void onMuteListAdded(String groupId, List<String> mutes, long muteExpire) {
}
@Override
public void onMuteListRemoved(String groupId, List<String> mutes) {
}
@Override
public void onWhiteListAdded(String groupId, List<String> whitelist) {
}
@Override
public void onWhiteListRemoved(String groupId, List<String> whitelist) {
}
@Override
public void onAllMemberMuteStateChanged(String groupId, boolean isMuted) {
}
@Override
public void onAdminAdded(String groupId, String administrator) {
}
@Override
public void onAdminRemoved(String groupId, String administrator) {
}
@Override
public void onOwnerChanged(String groupId, String newOwner, String oldOwner) {
}
@Override
public void onMemberJoined(String groupId, String member) {
}
@Override
public void onMemberExited(String groupId, String member) {
}
@Override
public void onAnnouncementChanged(String groupId, String announcement) {
}
@Override
public void onSharedFileAdded(String groupId, EMMucSharedFile sharedFile) {
}
@Override
public void onSharedFileDeleted(String groupId, String fileId) {
}
};