tencent cloud

文档反馈

Android&iOS&Mac

最后更新时间:2023-03-14 10:56:36

    功能描述

    群成员管理指的是对成员进行列表拉取、禁言、踢人、授权、转让群主等操作。相关方法在核心类 V2TIMGroupManager(Android) / V2TIMManager(Group)(iOS & Mac) 中。

    获取群成员列表

    您可以调用 getGroupMemberList (Android / iOS & Mac / Windows) 获取指定群的群成员列表。
    该列表中包含了各个群成员的资料信息,例如用户 ID(userID)、群名片(nameCard)、头像(faceUrl)、昵称(nickName)、进群时间(joinTime)等信息。

    直播群由于人数众多,不提供拉取全量成员列表的功能。根据旗舰版和非旗舰版区分不同的表现:

    1. 非旗舰版客户可调用 getGroupMemberList 拉取最近进群的 30 位群成员。
    2. 旗舰版客户可调用 getGroupMemberList 拉取最近进群的 1000 位群成员。此功能需要在 IM 控制台开启开关,如果不开启,默认跟非旗舰版表现一样,仅拉取最近进群 30 位群成员。
      旗舰版客户如需开启此功能,需要登录 即时通信 IM 控制台 修改相关配置。

    一个群中的成员人数可能很多(例如 5000+),群成员列表的拉取接口支持过滤器(filter)和分页拉取(nextSeq)两个高级特性。

    过滤器(filter)拉取

    在调用 getGroupMemberList (Android / iOS & Mac / Windows) 接口时,您可以指定 filterV2TIMGroupMemberFilter,拉取特定角色列表。

    过滤器 过滤类型
    V2TIM_GROUP_MEMBER_FILTER_ALL 拉取所有群成员的信息列表
    V2TIM_GROUP_MEMBER_FILTER_OWNER 仅拉取群主的信息列表
    V2TIM_GROUP_MEMBER_FILTER_ADMIN 仅拉取群管理员的信息列表
    V2TIM_GROUP_MEMBER_FILTER_COMMON 仅拉取普通群成员的信息列表

    对于直播群而言,除了将 filter 设置为 V2TIMGroupMemberFilter 以外,还可以设置为自定义群成员标记,从而筛选出指定标记的群成员。详情参考下文的 标记群成员

    示例代码如下:

    // 通过 filter 参数指定只拉取群主的资料
    int role = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_OWNER;
    V2TIMManager.getGroupManager().getGroupMemberList("testGroup", role, 0, 
        new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
        @Override
        public void onError(int code, String desc) {
            // 拉取失败
        }
    
    
    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onSuccess</span><span class="hljs-params">(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult)</span> </span>{
        <span class="hljs-comment">// 拉取成功</span>
    }
    

    });

    分页拉取(nextSeq)

    很多情况下,用户界面上并不需要展示全部的群成员信息,只需展示群成员列表的第一页即可。等用户单击“下一页”或在列表页上拉刷新时,才需要拉取更多的群成员。针对此类场景,您可以使用分页拉取。

    分页拉取的步骤为:

    1. 首次调用 getGroupMemberList 时,指定参数 nextSeq 为 0(表示从头开始拉取会话列表),一次最多拉取 50 个群成员对象。

    2. 首次拉取群成员列表成功后,getGroupMemberList 的回调结果 V2TIMGroupMemberInfoResult 中会包含 nextSeq(下次分页拉取的字段):

      • 如果 nextSeq 等于 0,表示已经拉取了全部的群成员。
      • 如果 nextSeq 大于 0,表示还有更多的群成员可以拉取。此时并不意味着要立刻开始拉取 “下一页” 的成员列表。在常见的软件中,分页拉取通常由用户的滑动操作触发的,用户通过上拉触发一次分页拉取。
    3. 当用户继续上拉刷新群成员时,如果还有更多的群成员可以拉取,可以继续调用 getGroupMemberList 接口,并传入新一轮的 nextSeq 参数(nextSeq 数值来自上一次拉取返回的 V2TIMGroupMemberInfoResult 对象)。

    4. 重复执行【步骤 3】直至 nextSeq 等于 0,拉取结束。

    示例代码如下:

    {
        ...
        long nextSeq = 0;
        getGroupMemberList(nextSeq);
        ...
    }
    
    

    public void getGroupMemberList(long nextSeq) {
    int filterRole = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL;
    V2TIMManager.getGroupManager().getGroupMemberList("testGroup", filterRole, nextSeq,
    new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {
    @Override
    public void onError(int code, String desc) {
    // 拉取失败
    }

        <span class="hljs-meta">@Override</span>
        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onSuccess</span><span class="hljs-params">(V2TIMGroupMemberInfoResult groupMemberInfoResult)</span> </span>{
            <span class="hljs-keyword">if</span> (groupMemberInfoResult.getNextSeq() != <span class="hljs-number">0</span>) {
                <span class="hljs-comment">// 继续分页拉取</span>
                getGroupMemberList(groupMemberInfoResult.getNextSeq());
                ...
            } <span class="hljs-keyword">else</span> {
                <span class="hljs-comment">// 拉取结束</span>
            }
        }
    });
    

    }

    标记群成员

    群主可以调用 markGroupMemberList (Android / iOS & Mac) 标记、取消标记直播群成员。规则如下:

    1. 只有直播群支持此功能,只有群主有权限操作。
    2. 每个直播群最多只能添加 10 个自定义标记。
    3. 通过 IM SDK 设置自定义标记类型为 uint32_t,必须大于等于 1000。
    4. 每次最多标记 100 名群成员。
    5. 被标记的群成员需要在线。当成员退群、掉线时标记信息会被清除。可以通过第三方回调在该成员进群、上线时重新设置标记。

    群成员被标记后,可以调用 getGroupMemberList,设置 filter 为所设置的自定义标记值,过滤出指定的群成员列表。

    说明:

    1. 仅增强版 6.6 及以上版本支持。
    2. 标记直播群成员仅对旗舰版客户开放,详情请参考 基础服务详情
    3. 如需使用此功能,您需要登录 即时通信 IM 控制台 开启开关。

    禁言

    禁言指定群成员

    群主或管理员可以调用 muteGroupMember (Android / iOS & Mac / Windows),设置 muteTime (单位为秒) 禁言某一个群成员。例如设置 muteTime 为 120,表示禁言该成员持续 120 秒。
    某群成员被禁言后,发送消息会失败,并接收到相应的错误码。如果想取消该成员的禁言,可以将 muteTime 设置为 0。

    禁言时间戳存储于群成员信息的 muteUntil(Android / iOS & Mac / Windows) 字段中。注意 muteUntil 的含义是禁言该成员直到某个时刻为止。

    群成员被禁言后,全员(包括被禁言的群成员)都会收到 onMemberInfoChanged (Android / iOS & Mac / Windows) 事件回调。

    说明:

    群主可以禁言/取消禁言管理员和普通群成员。管理员可以禁言/取消禁言普通群成员。

    禁言整个群

    群主或管理员也可以通过 setGroupInfo (Android / iOS & Mac / Windows) 接口对整个群进行禁言,将 allMuted (Android / iOS & Mac / Windows) 属性字段设置为 true/YES 即可。全群禁言没有时间限制,需通过将群资料 setAllMuted(false/NO) 解除禁言。

    全员禁言后触发 onGroupInfoChanged (Android / iOS & Mac / Windows) 事件回调。

    该通知默认是关闭的,如需开启此通知,您可以登录 即时通信 IM 控制台 修改相关配置。

    说明:

    只有群主能将管理员禁言。

    示例代码如下:

    // 禁言群成员 userB 1分钟
    V2TIMManager.getGroupManager().muteGroupMember("groupA", "userB", 60, new V2TIMCallback() {
      @Override
      public void onSuccess() {
          // 禁言群成员成功
      }
    
    

    @Override
    public void onError(int code, String desc) {
    // 禁言群成员失败
    }
    });

    // 全员禁言
    V2TIMGroupInfo info = new V2TIMGroupInfo();
    info.setGroupID("groupA");
    info.setAllMuted(true);
    V2TIMManager.getGroupManager().setGroupInfo(info, new V2TIMCallback() {
    @Override
    public void onSuccess() {
    // 全员禁言成功
    }

    @Override
    public void onError(int code, String desc) {
    // 全员禁言失败
    }
    });

    V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() {
    @Override
    public void onMemberInfoChanged(String groupID, List<V2TIMGroupMemberChangeInfo> v2TIMGroupMemberChangeInfoList) {
    // 禁言群成员监听
    for (V2TIMGroupMemberChangeInfo memberChangeInfo : v2TIMGroupMemberChangeInfoList) {
    // 被禁言用户 ID
    String userID = memberChangeInfo.getUserID();
    // 禁言时间
    long muteTime = memberChangeInfo.getMuteTime();
    }
    }

    @Override
    public void onGroupInfoChanged(String groupID, List<V2TIMGroupChangeInfo> changeInfos) {
    // 全员禁言监听
    for (V2TIMGroupChangeInfo groupChangeInfo : changeInfos) {
    if (groupChangeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_SHUT_UP_ALL) {
    // 是否全员禁言
    boolean isMuteAll = groupChangeInfo.getBoolValue();
    }
    }
    }
    });

    踢人

    群主或管理员调用 kickGroupMember (Android / iOS & Mac / Windows) 接口可以将指定的群成员踢出群组。

    群成员被踢后,全员(包括被踢的人)会收到 onMemberKicked (Android / iOS & Mac / Windows) 回调。

    说明:

    普通群,只有群主能将管理员踢出群组。

    对于直播群(AVChatRoom)而言:

    1. 增强版 6.6 以前,直播群不支持踢人。您可以使用 muteGroupMember (Android / iOS & Mac / Windows) 禁言指定成员达到类似的成员管控的目的,禁言操作参考 禁言
    2. 增强版 6.6 开始,直播群支持踢人。踢人接口及回调跟普通群一致。群成员被踢出直播群后,无法再加入该群,也不能再向群里发消息。直播群只有群主能踢人,管理员、普通成员均没有踢人权限。
      注意:

      1. 直播群踢人仅对旗舰版客户开放,详情请参考 基础服务详情
      2. 如需使用此功能,您需要登录 即时通信 IM 控制台 开启开关。

    示例代码如下:

    List<String> userIDList = new ArrayList<>();
    userIDList.add("userB");
    V2TIMManager.getGroupManager().kickGroupMember("groupA", userIDList, "", new V2TIMValueCallback<List<V2TIMGroupMemberOperationResult>>() {
      @Override
      public void onSuccess(List<V2TIMGroupMemberOperationResult> v2TIMGroupMemberOperationResults) {
          // 踢人成功
      }
    
    

    @Override
    public void onError(int code, String desc) {
    // 踢人失败
    }
    });

    V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() {
    @Override
    public void onMemberKicked(String groupID, V2TIMGroupMemberInfo opUser,
    List<V2TIMGroupMemberInfo> memberList)
    {
    // 群成员被踢通知
    }
    });

    设置管理员

    群主调用 setGroupMemberRole (Android / iOS & Mac / Windows) 可以对陌生人社交群(Public)或临时会议群(Meeting)中的群成员进行管理员授权。

    普通成员被授权后,拥有跟管理员同样的权限,例如支持以下操作:

    • 修改群组基本资料
    • 将普通群成员踢出群
    • 将普通群成员禁言(即禁止其在一段时间内发言)
    • 审批其他用户的入群申请
      更多详情可参考 群成员角色介绍

    普通成员被授权为管理员后,全员(包括被设置的成员)会收到 onGrantAdministrator (Android / iOS & Mac / Windows) 回调。

    普通成员被取消管理员授权后,全员(包括被设置的成员)会收到 onRevokeAdministrator (Android / iOS & Mac / Windows) 回调。

    示例代码如下:

    V2TIMManager.getGroupManager().setGroupMemberRole("groupA", "userB", V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_ADMIN, new V2TIMCallback() {
      @Override
      public void onSuccess() {
          // 更改群成员角色成功
      }
    
    

    @Override
    public void onError(int code, String desc) {
    // 更改群成员角色失败
    }
    });

    V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() {
    @Override
    public void onGrantAdministrator(String groupID, V2TIMGroupMemberInfo opUser,
    List<V2TIMGroupMemberInfo> memberList)
    {
    // 被设置管理员通知
    }

    @Override
    public void onRevokeAdministrator(String groupID, V2TIMGroupMemberInfo opUser,
    List<V2TIMGroupMemberInfo> memberList)
    {
    // 被取消管理员通知
    }
    });

    转让群主

    群主可以调用 transferGroupOwner(Android / iOS & Mac / Windows) 把群主转让给其他群成员。

    群主转让后,全员会收到 onGroupInfoChanged (Android / iOS & Mac / Windows) 回调,其中 V2TIMGroupChangeInfotypeV2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER,值为新群主的 UserID

    示例代码如下:

    V2TIMManager.getGroupManager().transferGroupOwner("groupA", "userB", new V2TIMCallback() {
      @Override
      public void onSuccess() {
          // 转让群主成功
      }
    
    

    @Override
    public void onError(int code, String desc) {
    // 转让群主失败
    }
    });

    获取群在线人数

    调用 getGroupOnlineMemberCount (Android / iOS & Mac / Windows) 可以获取群在线人数。

    说明:

    1. 目前仅直播群(AVChatRoom)支持获取群在线人数。
    2. SDK 调用频率限制为单个登录用户 60 秒 1 次。

    代码示例如下:

    V2TIMManager.getGroupManager().getGroupOnlineMemberCount("group_avchatroom", new V2TIMValueCallback<Integer>() {
      @Override
      public void onSuccess(Integer integer) {
          // 获取直播群在线人数成功
      }
    
    

    @Override
    public void onError(int code, String desc) {
    // 获取直播群在线人数失败
    }
    });

    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持