• UIKit
  • SDK
  • 服务端 API
Chat/
SDK/
Android/
群组/
SDK
  • 集成 SDK
  • 初始化
  • 登录登出
  • 消息
    • 介绍
    • 发送消息
    • 接收消息
    • 历史消息
    • 转发消息
    • 消息变更
    • 插入消息
    • 删除消息
    • 清空消息
    • 撤回消息
    • 在线消息
    • 已读回执
    • 查询消息
    • 群 @ 消息
    • 群定向消息
    • 消息免打套
    • 消息扩展
    • 消息回应
    • 消息翻译
    • 消息置顶
  • 会话
    • 介绍
    • 会话列表
    • 获取会话
    • 会话未读数
    • 置顶会话
    • 删除会话
    • 会话草稿
    • 会话标记
    • 会话分组
  • 群组
    • 介绍
    • 管理群组
    • 群资料
    • 管理群成员
    • 群成员资料
    • 自定义属性
    • 群计数器
  • 社群话题
    • 管理社群
    • 权限组
  • 用户
    • 用户资料
    • 用户状态
    • 管理好友
    • 好友分组
    • 黑名单
    • 关注与粉丝
  • 本地搜索
    • 搜索消息
    • 搜索好友
    • 搜索群组
    • 搜索群成员
  • 信令
  • 客户端 API
    • Java
  • 开发指引
  • 控制台指南
    • 创建和升级应用
    • 基本配置
    • 功能配置
    • 账号管理
    • 群组管理
    • 回调配置
  • 产品介绍
    • 消息管理
      • 单聊消息
      • 消息存储
      • 离线推送
      • 群消息
      • 消息格式
    • 账号系统
      • 登陆验证
      • 在线状态管理
    • 群相关
      • 群组系统
      • 群组管理
    • 用户资料和关系链
      • 资料管理
      • 关系链管理
  • 购买指南
    • 计费概述
    • 价格中心
  • 错误码

管理群成员

功能描述

群成员管理指的是对成员进行列表拉取、禁言、踢人、授权、转让群主等操作。

获取群成员列表

您可以调用 getGroupMemberList (Android / iOS & Mac / Windows) 获取指定群的群成员列表。 该列表中包含了各个群成员的资料信息,例如用户 ID(userID)、群名片(nameCard)、头像(faceUrl)、昵称(nickName)、进群时间(joinTime)、在线状态(isOnline)等信息。
直播群由于人数众多,不提供拉取全量成员列表的功能。进阶版客户可调用 getGroupMemberList 拉取最近进群的 1000 位群成员。此功能需要在控制台开启开关,开关路径:Applications > Your App > Chat > Configuration > Group Configuration > Group feature configuration > List of online audio-video group members。
一个群中的成员人数可能很多(例如 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 以外,还可以设置为自定义群成员标记,从而筛选出指定标记的群成员。详情参考下文的 标记群成员
示例代码如下:
Android
iOS & Mac
Windows
// 通过 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) {
// 拉取失败
}

@Override
public void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {
// 拉取成功
}
});
[[V2TIMManager sharedInstance] getGroupMemberList:@"groupA" filter:V2TIM_GROUP_MEMBER_FILTER_OWNER nextSeq:0 succ:^(uint64_t nextSeq, NSArray<V2TIMGroupMemberFullInfo *> *memberList) {
// 拉取成功
} fail:^(int code, NSString *desc) {
// 拉取失败
}];
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
using SuccessCallback = std::function<void(const T&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

ValueCallback() = default;
~ValueCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess(const T& value) override {
if (success_callback_) {
success_callback_(value);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

V2TIMString groupID = "testGroup";
// 通过 filter 参数指定只拉取群主的资料
uint32_t filter = V2TIMGroupMemberFilter::V2TIM_GROUP_MEMBER_FILTER_OWNER;
uint64_t nextSeq = 0;

auto callback = new ValueCallback<V2TIMGroupMemberInfoResult>{};
callback->SetCallback(
[=](const V2TIMGroupMemberInfoResult& groupMemberInfoResult) {
// 拉取成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 拉取失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->GetGroupMemberList(groupID, filter, nextSeq, callback);

分页拉取(nextSeq)

很多情况下,用户界面上并不需要展示全部的群成员信息,只需展示群成员列表的第一页即可。等用户单击“下一页”或在列表页上拉刷新时,才需要拉取更多的群成员。针对此类场景,您可以使用分页拉取。
分页拉取的步骤为:
1. 首次调用 getGroupMemberList 时,指定参数 nextSeq 为 0(表示从头开始拉取会话列表),一次最多拉取 50 个群成员对象。
2. 首次拉取群成员列表成功后,getGroupMemberList 的回调结果 V2TIMGroupMemberInfoResult 中会包含 nextSeq(下次分页拉取的字段):
如果 nextSeq 等于 0,表示已经拉取了全部的群成员。
如果 nextSeq 大于 0,表示还有更多的群成员可以拉取。此时并不意味着要立刻开始拉取 “下一页” 的成员列表。在常见的软件中,分页拉取通常由用户的滑动操作触发的,用户通过上拉触发一次分页拉取。
3. 当用户继续上拉刷新群成员时,如果还有更多的群成员可以拉取,可以继续调用 getGroupMemberList 接口,并传入新一轮的 nextSeq 参数(nextSeq 数值来自上一次拉取返回的 V2TIMGroupMemberInfoResult 对象)。
4. 重复执行【步骤 3】直至 nextSeq 等于 0,拉取结束。
示例代码如下:
Android
iOS & Mac
Windows
{
...
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) {
// 拉取失败
}

@Override
public void onSuccess(V2TIMGroupMemberInfoResult groupMemberInfoResult) {
if (groupMemberInfoResult.getNextSeq() != 0) {
// 继续分页拉取
getGroupMemberList(groupMemberInfoResult.getNextSeq());
...
} else {
// 拉取结束
}
}
});
}
- (void)getGroupMemberList:(uint32_t)seq {
[[V2TIMManager sharedInstance] getGroupMemberList:@"groupA" filter:V2TIM_GROUP_MEMBER_FILTER_OWNER nextSeq:seq succ:^(uint64_t nextSeq, NSArray<V2TIMGroupMemberFullInfo *> *memberList) {
if (nextSeq != 0) {
// 继续分页拉取
[self getGroupMemberList:nextSeq];
//...
} else {
// 拉取结束
}
} fail:^(int code, NSString *desc) {
// 拉取失败
}];
}
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
using SuccessCallback = std::function<void(const T&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

ValueCallback() = default;
~ValueCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess(const T& value) override {
if (success_callback_) {
success_callback_(value);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

V2TIMString groupID = "testGroup";
uint32_t filter = V2TIMGroupMemberFilter::V2TIM_GROUP_MEMBER_FILTER_ALL;
uint64_t nextSeq = 0;

auto callback = new ValueCallback<V2TIMGroupMemberInfoResult>{};
callback->SetCallback(
[=](const V2TIMGroupMemberInfoResult& groupMemberInfoResult) {
if (groupMemberInfoResult.nextSequence != 0) {
// 继续分页拉取 ...
}

delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 拉取失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->GetGroupMemberList(groupID, filter, nextSeq, callback);

标记群成员

群主可以调用 markGroupMemberList (Android / iOS & Mac / WIndows) 标记、取消标记直播群成员。规则如下:
1. 只有直播群和社群支持此功能,只有群主有权限操作。
2. 每个直播群最多只能添加 10 个自定义标记。
3. 通过 SDK 设置自定义标记类型为 uint32_t,必须大于等于 1000。
4. 每次最多标记 100 名群成员。
5. 被标记的群成员需要在线。当成员退群、掉线时标记信息会被清除。可以通过第三方回调在该成员进群、上线时重新设置标记。
群成员被标记后,可以调用 getGroupMemberList,设置 filter 为所设置的自定义标记值,过滤出指定的群成员列表。
说明:
1. 仅增强版 SDK 6.6 及以上版本支持。
2. 标记直播群成员仅对进阶版客户开放,购买进阶版后可使用。

禁言

禁言指定群成员

群主或管理员可以调用 muteGroupMember (Android / iOS & Mac / Windows),设置 muteTime (单位为秒) 禁言某一个群成员。例如设置 muteTime 为 120,表示禁言该成员持续 120 秒。 某群成员被禁言后,发送消息会失败,并接收到相应的错误码。如果想取消该成员的禁言,可以将 muteTime 设置为 0。
禁言时间戳存储于群成员信息的 muteUntil(Android / iOS & Mac / Windows) 字段中。注意 muteUntil 的含义是禁言该成员直到某个时刻为止。
群成员被禁言后,全员(包括被禁言的群成员)都会收到 onMemberInfoChanged (Android / iOS & Mac / Windows) 事件回调。
说明:
群主可以禁言/取消禁言管理员和普通群成员。管理员可以禁言/取消禁言普通群成员。

禁言整个群

群主或管理员也可以通过 muteAllGroupMembers (Android / iOS & Mac / Windows) 接口对整个群进行禁言,将 isMute字段设置为 true/YES 即可,解除禁言则设置为 false/NO。全群禁言没有时间限制。
全员禁言后触发 onGroupInfoChanged (Android / iOS & Mac / Windows) 事件回调。
该通知默认是关闭的,如需开启此通知,您可以登录控制台修改相关配置,配置路径:Applications > Your App > Chat > Configuration > Group Configuration > Group system notification configuration > Notification of group profile change > Notification of muting all change。
说明:
只有群主能将管理员禁言。
示例代码如下:
Android
iOS & Mac
Windows
// 禁言群成员 userB 1分钟
V2TIMManager.getGroupManager().muteGroupMember("groupA", "userB", 60, new V2TIMCallback() {
@Override
public void onSuccess() {
// 禁言群成员成功
}

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

// 全员禁言
// 全员禁言
V2TIMManager.getGroupManager().muteAllGroupMembers("groupA", true, 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 onAllGroupMembersMuted(String groupID, boolean isMute) {
// 全员禁言监听
}
});
// 禁言群成员 user1 1分钟
[[V2TIMManager sharedInstance] muteGroupMember:@"groupA" member:@"user1" muteTime:60 succ:^{
// 禁言群成员成功
} fail:^(int code, NSString *desc) {
// 禁言群成员失败
}];

// 全员禁言
[[V2TIMManager sharedInstance] muteAllGroupMembers:@"groupA" isMute:YES succ:^{
// 全员禁言成功
} fail:^(int code, NSString *desc) {
// 全员禁言失败
}];

[[V2TIMManager sharedInstance] addGroupListener:self];
- (void)onMemberInfoChanged:(NSString *)groupID changeInfoList:(NSArray <V2TIMGroupMemberChangeInfo *> *)changeInfoList {
// 禁言群成员监听
for (V2TIMGroupMemberChangeInfo *memberChangeInfo in changeInfoList) {
// 被禁言用户 ID
NSString *userID = memberChangeInfo.userID;
// 禁言时间
uint32_t muteTime = memberChangeInfo.muteTime;
}
}

- (void)onAllGroupMembersMuted:(NSString *)groupID isMute:(BOOL)isMute {
// 全员禁言监听
}
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

Callback() = default;
~Callback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess() override {
if (success_callback_) {
success_callback_();
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

// 禁言群成员 userB 1分钟
auto callback = new Callback;
callback->SetCallback(
[=]() {
// 禁言群成员成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 禁言群成员失败
delete callback;
});
V2TIMManager::GetInstance()->GetGroupManager()->MuteGroupMember("groupA", "userB", 60, callback);

// 全员禁言
callback->SetCallback(
[=]() {
// 全员禁言成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 全员禁言失败
delete callback;
});
V2TIMManager::GetInstance()->GetGroupManager()->muteAllGroupMembers("groupA", true, callback);

// 监听禁言群成员/全员禁言通知
class GroupListener final : public V2TIMGroupListener {
public:
GroupListener() = default;
~GroupListener() override = default;

void OnMemberInfoChanged(const V2TIMString& groupID,
const V2TIMGroupMemberChangeInfoVector& groupMemberChangeInfoList) override {
// 禁言群成员监听
for (size_t i = 0; i < groupMemberChangeInfoList.Size(); ++i) {
const V2TIMGroupMemberChangeInfo& groupMemberChangeInfo = groupMemberChangeInfoList[i];
// 被禁言用户 ID
V2TIMString userID = groupMemberChangeInfo.userID;
// 禁言时间
uint32_t muteTime = groupMemberChangeInfo.muteTime;
}
}
void onAllGroupMembersMuted(const V2TIMString& groupID,
bool isMute) override {
// 全员禁言监听
}
// 其他成员 ...
};
// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调
GroupListener groupListener;
V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

踢人

SDK 提供了面向所有群类型的基本踢人接口和高级踢人接口,群主或管理员可以调用 SDK 提供的踢人接口将指定的群成员踢出群组。

踢人基本接口

群主或管理员调用 kickGroupMember  (Android / iOS & Mac / Windows) 接口可以将指定的群成员踢出群组。群成员被踢后,全员(包括被踢的人)都会收到 onMemberKicked (Android / iOS & Mac / Windows) 回调。
除了直播群外,其他类型群使用该接口踢人后,被踢用户可以再次申请加群或者被邀请进群,直播群详见直播群踢人
示例代码如下:
Android
iOS & Mac
Windows
List<String> userIDList = new ArrayList<>();
userIDList.add("userB");
V2TIMManager.getGroupManager().kickGroupMember("groupA", userIDList, "", newV2TIMValueCallback<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) {
// 群成员被踢通知
}
});
[[V2TIMManager sharedInstance] kickGroupMember:@"groupA" memberList:@[@"user1"] reason:@"" succ:^(NSArray<V2TIMGroupMemberOperationResult *> *resultList) {
// 踢人成功
} fail:^(int code, NSString *desc) {
// 踢人失败
}];

[[V2TIMManager sharedInstance] addGroupListener:self];
- (void)onMemberKicked:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray<V2TIMGroupMemberInfo *>*)memberList {
// 群成员被踢通知
}
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
using SuccessCallback = std::function<void(const T&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

ValueCallback() = default;
~ValueCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess(const T& value) override {
if (success_callback_) {
success_callback_(value);
}
}

void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

V2TIMString groupID = "groupA";
V2TIMStringVector memberList;
memberList.PushBack("userB");

auto callback = new ValueCallback<V2TIMGroupMemberOperationResultVector>{};
callback->SetCallback(
[=](const V2TIMGroupMemberOperationResultVector& groupMemberOperationResultList) {
// 踢人成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 踢人失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->KickGroupMember(groupID, memberList, {}, callback);

// 监听群成员被踢通知
class GroupListener final : public V2TIMGroupListener {
public:
GroupListener() = default;
~GroupListener() override = default;

void OnMemberKicked(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser, const V2TIMGroupMemberInfoVector& memberList) override {
// 群成员被踢通知
}
};

// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调
GroupListener groupListener;
V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

踢人高级接口

从 7.2 版本开始,SDK 对 kickGroupMember  (Android / iOS & Mac / Windows) 接口做了功能升级,新增 duration 参数,用于指定用户被踢出群组开始算起,禁止重新申请加群的时长。
注意:
该接口仅对进阶版客户开放,当调用该接口踢出群成员时,仅集成了 IMSDK 6.6 及其以上版本的全员(包括被踢的人)会收到 onMemberKicked (Android / iOS & Mac / Windows) 回调。
示例代码如下:
Android
iOS & Mac
Windows
List<String> userIDList = new ArrayList<>();
userIDList.add("userB");
V2TIMManager.getGroupManager().kickGroupMember("groupA", userIDList, "", 100, newV2TIMValueCallback<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) {
// 群成员被踢通知
}
});
[[V2TIMManager sharedInstance] kickGroupMember:@"groupA" memberList:@[@"user1"] reason:@"" duration:100 succ:^(NSArray<V2TIMGroupMemberOperationResult *> *resultList) {
// 踢人成功
} fail:^(int code, NSString *desc) {
// 踢人失败
}];

[[V2TIMManager sharedInstance] addGroupListener:self];
- (void)onMemberKicked:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray<V2TIMGroupMemberInfo *>*)memberList {
// 群成员被踢通知
}
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
using SuccessCallback = std::function<void(const T&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

ValueCallback() = default;
~ValueCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess(const T& value) override {
if (success_callback_) {
success_callback_(value);
}
}

void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

V2TIMString groupID = "groupA";
V2TIMStringVector memberList;
memberList.PushBack("userB");

auto callback = new ValueCallback<V2TIMGroupMemberOperationResultVector>{};
callback->SetCallback(
[=](const V2TIMGroupMemberOperationResultVector& groupMemberOperationResultList) {
// 踢人成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 踢人失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->KickGroupMember(groupID, memberList, {}, 100, callback);

// 监听群成员被踢通知
class GroupListener final : public V2TIMGroupListener {
public:
GroupListener() = default;
~GroupListener() override = default;

void OnMemberKicked(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser,
const V2TIMGroupMemberInfoVector& memberList) override {
// 群成员被踢通知
}
};

// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调
GroupListener groupListener;
V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

直播群踢人

对于直播群(AVChatRoom)而言:
1. 增强版 6.6 以前,直播群不支持踢人。您可以使用 muteGroupMember (Android / iOS & Mac / Windows) 禁言指定成员达到类似的成员管控的目的,禁言操作参考 禁言
2. 增强版 6.6 开始,直播群支持踢人。您可以使用基础接口踢出群成员,群成员被踢出直播群后,无法再加入该群,也不能再向群里发消息。直播群中群主和管理员均能踢人,普通成员没有踢人权限。
3. 从 7.2 版本开始,直播群也可以使用高级接口踢出群成员,并设置自定义时间,用以指定被踢用户可再次加群的时间间隔。
注意:
1. 6.6 及其以后的版本,直播群踢人仅对进阶版客户开放,需要购买进阶版后使用。
2. 如需使用直播群踢人,您需要登录控制台开启开关,开关路径:Applications > Your App > Chat > Configuration > Group Configuration > Group feature configuration > Audio-video group member banning。

设置管理员

群主调用 setGroupMemberRole (Android / iOS & Mac / Windows) 可以对陌生人社交群(Public)、临时会议群(Meeting)和直播群(AVChatRoom)中的群成员进行管理员授权。
普通成员被授权后,拥有跟管理员同样的权限,例如支持以下操作:
修改群组基本资料
将普通群成员踢出群
将普通群成员禁言(即禁止其在一段时间内发言)
审批其他用户的入群申请
更多详情可参考 群成员角色介绍
直播群普通成员被授权后,拥有跟管理员同样的权限,例如:
将普通群成员踢出直播群。
普通成员被授权为管理员后,全员(包括被设置的成员)会收到 onGrantAdministrator (Android / iOS & Mac / Windows) 回调。
普通成员被取消管理员授权后,全员(包括被设置的成员)会收到 onRevokeAdministrator (Android / iOS & Mac / Windows) 回调。
示例代码如下:
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) {
// 被取消管理员通知
}
});
[[V2TIMManager sharedInstance] setGroupMemberRole:@"groupA" member:@"user1" newRole:V2TIM_GROUP_MEMBER_ROLE_ADMIN succ:^{
// 更改群成员角色成功
} fail:^(int code, NSString *desc) {
// 更改群成员角色失败
}];

[[V2TIMManager sharedInstance] addGroupListener:self];
- (void)onGrantAdministrator:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray <V2TIMGroupMemberInfo *> *)memberList {
// 被设置管理员通知
}

- (void)onRevokeAdministrator:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray <V2TIMGroupMemberInfo *> *)memberList {
// 被取消管理员通知
}
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

Callback() = default;
~Callback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess() override {
if (success_callback_) {
success_callback_();
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

V2TIMString groupID = "groupA";
V2TIMString userID = "userB";
uint32_t role = V2TIMGroupMemberRole::V2TIM_GROUP_MEMBER_ROLE_ADMIN;

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 更改群成员角色成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 更改群成员角色失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->SetGroupMemberRole(groupID, userID, role, callback);

// 监听被设置管理员通知
class GroupListener final : public V2TIMGroupListener {
public:
GroupListener() = default;
~GroupListener() override = default;

void OnGrantAdministrator(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser,
const V2TIMGroupMemberInfoVector& memberList) override {
// 被设置管理员通知
}
void OnRevokeAdministrator(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser,
const V2TIMGroupMemberInfoVector& memberList) override {
// 被取消管理员通知
}
// 其他成员 ...
};
// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调
GroupListener groupListener;
V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

转让群主

群主可以调用 transferGroupOwner(Android / iOS & Mac / Windows) 把群主转让给其他群成员。
群主转让后,全员会收到 onGroupInfoChanged (Android / iOS & Mac / Windows) 回调,其中 V2TIMGroupChangeInfotypeV2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER,值为新群主的 UserID
示例代码如下:
Android
iOS & Mac
Windows
V2TIMManager.getGroupManager().transferGroupOwner("groupA", "userB", new V2TIMCallback() {
@Override
public void onSuccess() {
// 转让群主成功
}

@Override
public void onError(int code, String desc) {
// 转让群主失败
}
});
[[V2TIMManager sharedInstance] transferGroupOwner:@"groupA" member:@"user1" succ:^{
// 转让群主成功
} fail:^(int code, NSString *desc) {
// 转让群主失败
}];
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

Callback() = default;
~Callback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess() override {
if (success_callback_) {
success_callback_();
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

V2TIMString groupID = "groupA";
V2TIMString userID = "userB";

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 转让群主成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 转让群主失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->TransferGroupOwner(groupID, userID, callback);

获取群在线人数

调用 getGroupOnlineMemberCount (Android / iOS & Mac / Windows) 可以获取群在线人数。
说明
1. 增强版 SDK 7.3 以前的版本仅支持直播群( AVChatRoom)。
2. 增强版 SDK 7.3 及以后的版本支持所有群类型。
代码示例如下:
Android
iOS & Mac
Windows
V2TIMManager.getGroupManager().getGroupOnlineMemberCount("group_avchatroom", new V2TIMValueCallback<Integer>() {
@Override
public void onSuccess(Integer integer) {
// 获取直播群在线人数成功
}

@Override
public void onError(int code, String desc) {
// 获取直播群在线人数失败
}
});
[[V2TIMManager sharedInstance] getGroupOnlineMemberCount:@"group_avchatroom" succ:^(NSInteger count) {
// 获取直播群在线人数成功
} fail:^(int code, NSString *desc) {
// 获取直播群在线人数失败
}];
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
using SuccessCallback = std::function<void(const T&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

ValueCallback() = default;
~ValueCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess(const T& value) override {
if (success_callback_) {
success_callback_(value);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

V2TIMString groupID = "group_avchatroom";

auto callback = new ValueCallback<uint32_t>{};
callback->SetCallback(
[=](const uint32_t& count) {
// 获取直播群在线人数成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 获取直播群在线人数失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->GetGroupOnlineMemberCount(groupID, callback);