创建和管理群组

更新时间:2022-02-28

群组是支持多人沟通的即时通讯系统,本文介绍如何使用环信即时通讯 IM SDK 在实时互动 app 中创建和管理群组,并实现群组相关功能。

如需查看消息相关内容,参见 消息管理

环信即时通讯 IM Android SDK 提供 EMGroupManager 类和 EMGroup 类,用于管理群组,其中包含如下主要方法:

  • createGroup 创建群组;
  • destroyGroup 解散群组;
  • joinGroup 加入群组;
  • leaveGroup 退出群组;
  • getGroupFromServer 获取群组详情;
  • fetchGroupMembers 获取群成员列表;
  • getJoinedGroupsFromServer 从服务器端获取已加入的群组列表;
  • getAllGroups 从本地获取群组列表;
  • getPublicGroupsFromServer 从服务器端获取公开群列表;
  • blockGroupMessage 屏蔽群消息;
  • unblockGroupMessage 取消群消息屏蔽;
  • addGroupChangeListener 添加群组事件监听;
  • removeGroupChangeListener 移除群组事件监听。

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

  • 完成 SDK 初始化,详见 快速开始
  • 了解环信即时通讯 IM API 的使用限制,详见 使用限制。。
  • 了解群组和群成员数量限制,详见 使用限制

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、群组名称、群组描述、群组基本属性、群主、群组管理员列表。另外,若设置 fetchMemberstrue,获取群组详情时同时获取群成员,默认获取最大数量为 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) {
    
           }
       };