群成员管理

更新时间:2022-02-28

本文介绍如何管理群组成员。

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

  • addUsersToGroup 群主和群管理员邀请用户入群;
  • inviteUser 群成员邀请用户入群;
  • removeUserFromGroup 群组踢人;
  • changeOwner 变更群主;
  • addGroupAdmin 添加群管理员;
  • removeGroupAdmin 移除群管理员;
  • getAdminList 获取群管理员列表;
  • blockUser 将群成员加入群黑名单;
  • unblockUser 将用户移除群黑名单;
  • getBlockedUsers 获取群黑名单列表;
  • muteGroupMembers 禁言指定群成员;
  • unMuteGroupMembers 将指定用户从禁言列表中移除;
  • fetchGroupMuteList 获取群禁言列表;
  • muteAllMembers 开启群全员禁言;
  • unmuteAllMembers 关闭群全员禁言;
  • addToGroupWhiteList 添加群成员至群白名单;
  • removeFromGroupWhiteList 将群成员移出群白名单;
  • checkIfInGroupWhiteList 检查自己是否在群白名单中;
  • fetchGroupWhiteList 获取群白名单列表。

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

群组加人

1、根据不同群类型,群组加人会有差别。

  • 不管是私有群还是公开群,群主和管理员均可通过 EMGroupManager#addUsersToGroup 加人;
  • 如果私有群放开了群成员要求,群成员也可邀请用户入群。

2、需要用户确认才能加入群。

被邀请人将会收到群组事件回调 EMGroupChangeListener#onInvitationReceived

  • 如果用户同意加入群组。
    • 邀请人将会收到回调 EMGroupChangeListener#onInvitationAcceptedEMGroupChangeListener#onMemberJoined
    • 其他群成员将会收到回调 EMGroupChangeListener#onMemberJoined
  • 如果用户拒绝加入群组,邀请人将会收到回调 EMGroupChangeListener#onInvitationDeclined

3、如果无需用户确认直接加入群组的情况。

  • 被邀请人将会收到回调 EMGroupChangeListener#onAutoAcceptInvitationFromGroup
  • 邀请人将会收到回调 EMGroupChangeListener#onInvitationAcceptedEMGroupChangeListener#onMemberJoined;其他群成员将会收到回调 EMGroupChangeListener#onMemberJoined

4、用户入群后,将收到群消息。

示例代码如下:

  • 群主加人:
//Asynchronous processing is required
EMClient.getInstance().groupManager().addUsersToGroup(groupId, newmembers);
  • 私有群成员邀请用户入群:
//Asynchronous processing is required
EMClient.getInstance().groupManager().inviteUser(groupId, newmembers, null);

群组踢人

1、管理员以上权限可以将群成员踢出群组。

2、群成员被踢出群组后,将不会再接收到群消息。

3、群成员被踢出群组后,被踢群成员将会收到群组事件回调 EMGroupChangeListener#onUserRemoved,其他成员将会收到回调 EMGroupChangeListener#onMemberExited

示例代码如下:

//Asynchronous processing is required
EMClient.getInstance().groupManager().removeUserFromGroup(groupId, username);

变更群主

群主可以将权限移交给群组中指定成员,移交后原群主权限变为成员权限,群成员将会接收到群组事件回调 EMGroupChangeListener#onOwnerChanged

示例如下:

//Asynchronous processing required
EMClient.getInstance().groupManager().changeOwner(groupId, newOwner);

添加和移除管理员权限

添加管理员权限

管理员除了不能散群组等少数权限外,拥有对群组的绝大部分权限。添加群管理员只能由群主操作。添加群管理员后,被添加为管理员的成员和其他管理员将会接收到群组事件回调 EMGroupChangeListener#onAdminAdded

示例代码:

/**
     * 添加群组管理员。
     * 仅群主可调用此方法,admin 无权限。
     * 异步方法见 {@link #asyncAddGroupAdmin(String, String, EMValueCallBack)}。
   *

   * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @param admin                 新增的管理员 ID。
     * @return                      返回更新后的群组对象。
     * @throws HyphenateException   如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
       */
       EMClient.getInstance().groupManager().addGroupAdmin(groupId, admin);
       

移除管理员权限

群主移除指定群管理员的权限后,将只拥有群成员的权限。被移除管理员的成员和其他管理员将会接收到群组事件回调 EMGroupChangeListener#onAdminRemoved

示例代码如下:

/**
     * 删除群组管理员。
     * 仅群主可调用此方法。
     * 异步方法见 {@link #asyncRemoveGroupAdmin(String, String, EMValueCallBack)}。
   *

   * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @param admin                 删除的管理员 ID。
     * @return                      返回更新后的群组对象。
     * @throws HyphenateException   如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
       *
       */
       EMClient.getInstance().groupManager().removeGroupAdmin(groupId, admin);

获取群管理员列表

获取群管理员列表示例如下:

//获取内存中管理员列表。
List<String> adminList = group.getAdminList();

或者也可以用 获取群组详情

群组黑名单

群主及群管理员可以将群组中的指定群成员加入或者移出群黑名单。群成员被加入黑名单后将无法收发群消息。

将群成员拉入群组黑名单

群成员被群主或者群管理员加入群黑名单后将无法接收群消息,并同时被移出群粗,该用户无法申请再次加入群组。

示例代码如下:

/**
     * 将用户加入群组黑名单。
     * 先将用户移出群,再加入黑名单。加入黑名单的用户无法加入群。
     * 仅群主和管理员可调用此方法。
     * 异步方法见 {@link #asyncBlockUser(String, String, EMCallBack)}。
     * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @param username              要加入黑名单的用户名。

   * @throws HyphenateException 如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
     *
     */
     EMClient.getInstance().groupManager().blockUser(groupId, username);
     

将群成员移出群黑名单

指定用户被群主或者群管理员移出群黑名单后,可以再次申请加入群组。

示例代码如下:

/**
     * 将用户从群组黑名单中移除。
     * 仅群主和管理员可调用此方法。
     * 异步方法见 {@link #asyncUnblockUser(String, String, EMCallBack)}。
     *
     * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @param username              要从黑名单中移除的用户。
     * @throws HyphenateException   如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
     */
EMClient.getInstance().groupManager().unblockUser(groupId, username);

获取群组的黑名单用户列表

群主及群管理员可以从服务或获取群组的黑名单用户 ID 列表。

示例代码如下:

/**
     * 获取群组的黑名单列表, 默认最多取 200 个.
     * 仅群主和管理员可调用此方法。
     * 异步方法见 {@link #asyncGetBlockedUsers(String, EMValueCallBack)}。
     *
     * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @return List                 返回黑名单列表。
     * @throws HyphenateException   如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
     *
     */
EMClient.getInstance().groupManager().getBlockedUsers(groupId);

群组禁言

为了方便管理群组,环信即时通讯 IM SDK 提供了针对成员和群组的禁言操作。

将群成员加入和移出禁言列表

为了精细化管理群成员发言,群主和群成员可以根据情况将指定群成员加入或者移出群禁言列表。群成员被加入群禁言列表后,将不能够发言,即使其被加入群白名单也不能发言。

  • 将群成员加入禁言列表中

群成员被群主或者群管理员加入禁言列表中后,被禁言成员和其他未操作的管理员或者群主将会收到群组事件回调 EMGroupChangeListener#onMuteListAdded

/**
     * 将一组成员禁言。
     * 仅群主和管理员可调用此方法。
     * 异步方法见 {@link #aysncMuteGroupMembers(String, List, long, EMValueCallBack)}。
   *

   * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @param muteMembers           要禁言的用户列表。
     * @param duration              禁言时长,单位为毫秒。
     * @return                      返回更新后的群组对象。
     * @throws HyphenateException   如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
       */
       EMClient.getInstance().groupManager().muteGroupMembers(groupId, muteMembers, duration);
       
  • 将群成员移出禁言列表

群成员被群主或者群管理员移出禁言列表后,被移出的群成员及其他未操作的管理员或者群主将会收到群组事件回调 EMGroupChangeListener#onMuteListRemoved

/**
     * 解除禁言。
     * 仅群主和管理员可调用此方法。
     * 异步方法见 {@link #asyncUnMuteGroupMembers(String, List, EMValueCallBack)}。
     *

   * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @param members               要解除禁言的用户列表。
     * @return                      返回更新后的群组对象。
     * @throws HyphenateException   如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
       */
       EMClient.getInstance().groupManager().unMuteGroupMembers(String groupId, List<String> members);
       

获取群成员禁言列表

群主和群管理员可以获取群组的禁言列表。

示例代码如下:

/**
     * 获取群组的禁言列表。
     * 仅聊天室创建者和管理员可调用此方法。
     * 异步方法见 {@link #asyncFetchGroupMuteList(String, int, int, EMValueCallBack)}
   *

   * 同步方法,会阻塞当前线程。
     *
     * @param groupId               群组 ID。
     * @param pageNum               当前页码,从 1 开始。
     * @param pageSize              每页返回的禁言成员数。
     * @return                      返回的包含禁言成员 ID 及其禁言时长的 Map,其中每一项的 key 是禁言的成员 ID,value 是禁言时间,单位是毫秒。
     * @throws HyphenateException   如果有异常会在此抛出,包括错误码和错误信息,详见 {@link EMError}。
       */
       EMClient.getInstance().groupManager().fetchGroupMuteList(String groupId, int pageNum, int pageSize);
       

开启和关闭全员禁言

为了快捷管理群成员发言,群主和群成员可以开启和关闭群组全员禁言。开启群组全员禁言后,除了在群白名单中的群成员,其他成员将不能发言。

开启全员禁言

群主和群管理员开启群组全员禁言后,除了在白名单中的群成员,其他成员将不能发言。开启群组全员禁言后,群成员将会收到群组事件回调 EMGroupChangeListener#onAllMemberMuteStateChanged

示例代码如下:

/**

   * 设置全员禁言。
     * 仅群主和管理员可调用此方法。
       *
     * 异步方法。
       *
   * @param groupId     群组 ID。
     * @param callBack  结果回调,成功时回调 {@link EMValueCallBack#onSuccess(Object)},
     * 返回更新后的群组对象;
     * 失败时回调 {@link EMValueCallBack#onError(int, String)}。
       */
       public void muteAllMembers(final String groupId, final EMValueCallBack<EMGroup> callBack);
       

关闭全员禁言

群主和群管理员可以关闭群组全员禁言。关闭群组全员禁言后,群成员将会收到群组事件回调 EMGroupChangeListener#onAllMemberMuteStateChanged

示例代码如下:

/**

   * 解除全员禁言。
     * 仅群主和管理员可调用此方法。
       *
     * 异步方法。
       *
   * @param groupId     群组 ID。
     * @param callBack  结果回调,成功时回调 {@link EMValueCallBack#onSuccess(Object)},
     * 返回更新后的群组对象;
     * 失败时回调 {@link EMValueCallBack#onError(int, String)}。
       */
       public void unmuteAllMembers(final String groupId, final EMValueCallBack<EMGroup> callBack);
       

白名单管理

群主和群管理员可以将指定群成员加入或者移出群白名单,在开启群组全员禁言后,白名单用户不受全员禁言限制。如果白名单用户在群禁言列表中,该用户也不能发言。

添加用户到白名单

群成员被群主或者群管理员添加到群白名单后,该群成员及其他未操作的群管理员和群主将会收到群组事件回调 EMGroupChangeListener#onWhiteListAdded

/**
     * 添加白名单。
     * 仅群组创建者和管理员可调用此方法。
     *
     * 异步方法。 
     *
     * @param groupId   群组 ID。
     * @param members   要添加的成员列表。
     * @param callBack  结果回调,成功时回调 {@link EMCallBack#onSuccess()},
     * 失败时回调 {@link EMCallBack#onError(int, String)}。 
     */
public void addToGroupWhiteList(final String groupId, final List<String> members, final EMCallBack callBack);

将用户移出白名单

群成员被群主或者群管理员移除群白名单后,该群成员及其他未操作的群管理员和群主将会收到群组事件回调 EMGroupChangeListener#onWhiteListRemoved

/**
     * 将用户移出白名单。
     * 仅群组创建者和管理员可调用此方法。
     *
     * 异步方法。
     *
     * @param groupId   群组 ID。
     * @param members   需要从白名单中移除的成员 ID 列表。
     * @param callBack  结果回调,成功时回调 {@link EMCallBack#onSuccess()},
     * 失败时回调 {@link EMCallBack#onError(int, String)}。
     */
public void removeFromGroupWhiteList(final String groupId, final List<String> members, final EMCallBack callBack);

检查自己是否在白名单中

用户可以调用如下 API 检查自己是否在群白名单中:

/**
     * \~chinese
     * 检查自己是否在群组白名单中。
     *
     * 异步方法。
     *
     * @param groupId   群组 ID。
     * @param callBack  结果回调,成功时回调 {@link EMValueCallBack#onSuccess(Object)},
     * 返回是否在群组白名单的布尔值;
     * 失败时回调 {@link EMValueCallBack#onError(int, String)}。
     *
     */
public void checkIfInGroupWhiteList(final String groupId, EMValueCallBack<Boolean> callBack)

获取白名单成员列表

群主和群管理员可以获取群组白名单列表。

/**
     * \~chinese
     * 获取群组白名单列表。
     * 仅聊天室创建者和管理员可调用此方法。
     *
     * 异步方法。
     *
     * @param groupId   群组 ID。
     * @param callBack  结果回调,成功时回调 {@link EMValueCallBack#onSuccess(Object)},
     * 返回白名单列表;
     * 失败时回调 {@link EMValueCallBack#onError(int, String)}。
     *
     */
public void fetchGroupWhiteList(final String groupId, final EMValueCallBack<List<String>> callBack);