功能描述
群成员管理指的是对成员进行列表拉取、禁言、踢人、授权、转让群主等操作。相关方法在核心类 V2TIMGroupManager(Android)
/ V2TIMManager(Group)(iOS & Mac)
中。
获取群成员列表
您可以调用 getGroupMemberList
(Android / iOS & Mac / Windows) 获取指定群的群成员列表。
该列表中包含了各个群成员的资料信息,例如用户 ID(userID
)、群名片(nameCard
)、头像(faceUrl
)、昵称(nickName
)、进群时间(joinTime
)等信息。
直播群由于人数众多,不提供拉取全量成员列表的功能。根据旗舰版和非旗舰版区分不同的表现:
- 非旗舰版客户可调用
getGroupMemberList
拉取最近进群的 30 位群成员。
- 旗舰版客户可调用
getGroupMemberList
拉取最近进群的 1000 位群成员。此功能需要在 IM 控制台开启开关,如果不开启,默认跟非旗舰版表现一样,仅拉取最近进群 30 位群成员。
旗舰版客户如需开启此功能,需要登录 即时通信 IM 控制台 修改相关配置。
一个群中的成员人数可能很多(例如 5000+),群成员列表的拉取接口支持过滤器(filter
)和分页拉取(nextSeq
)两个高级特性。
过滤器(filter)拉取
在调用 getGroupMemberList
(Android / iOS & Mac / Windows) 接口时,您可以指定 filter
为 V2TIMGroupMemberFilter
,拉取特定角色列表。
过滤器 |
过滤类型 |
V2TIM_GROUP_MEMBER_FILTER_ALL |
拉取所有群成员的信息列表 |
V2TIM_GROUP_MEMBER_FILTER_OWNER |
仅拉取群主的信息列表 |
V2TIM_GROUP_MEMBER_FILTER_ADMIN |
仅拉取群管理员的信息列表 |
V2TIM_GROUP_MEMBER_FILTER_COMMON |
仅拉取普通群成员的信息列表 |
对于直播群而言,除了将 filter
设置为 V2TIMGroupMemberFilter
以外,还可以设置为自定义群成员标记,从而筛选出指定标记的群成员。详情参考下文的 标记群成员。
示例代码如下:
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>
}
});
[[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&)>;
<span class="hljs-built_in">ValueCallback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">ValueCallback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">(<span class="hljs-keyword">const</span> T& value)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>(value);
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(error_code, error_message);
}
}
private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};
V2TIMString groupID = "testGroup";
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)
很多情况下,用户界面上并不需要展示全部的群成员信息,只需展示群成员列表的第一页即可。等用户单击“下一页”或在列表页上拉刷新时,才需要拉取更多的群成员。针对此类场景,您可以使用分页拉取。
分页拉取的步骤为:
首次调用 getGroupMemberList
时,指定参数 nextSeq
为 0(表示从头开始拉取会话列表),一次最多拉取 50 个群成员对象。
首次拉取群成员列表成功后,getGroupMemberList
的回调结果 V2TIMGroupMemberInfoResult
中会包含 nextSeq
(下次分页拉取的字段):
- 如果
nextSeq
等于 0,表示已经拉取了全部的群成员。
- 如果
nextSeq
大于 0,表示还有更多的群成员可以拉取。此时并不意味着要立刻开始拉取 “下一页” 的成员列表。在常见的软件中,分页拉取通常由用户的滑动操作触发的,用户通过上拉触发一次分页拉取。
当用户继续上拉刷新群成员时,如果还有更多的群成员可以拉取,可以继续调用 getGroupMemberList
接口,并传入新一轮的 nextSeq
参数(nextSeq
数值来自上一次拉取返回的 V2TIMGroupMemberInfoResult
对象)。
重复执行【步骤 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>
}
}
});
}
- (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&)>;
<span class="hljs-built_in">ValueCallback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">ValueCallback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">(<span class="hljs-keyword">const</span> T& value)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>(value);
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(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) {
}
<span class="hljs-keyword">delete</span> callback;
},
[=](<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message) {
<span class="hljs-comment">// 拉取失败</span>
<span class="hljs-keyword">delete</span> callback;
});
V2TIMManager::GetInstance()->GetGroupManager()->GetGroupMemberList(groupID, filter, nextSeq, callback);
标记群成员
群主可以调用 markGroupMemberList
(Android / iOS & Mac) 标记、取消标记直播群成员。规则如下:
- 只有直播群支持此功能,只有群主有权限操作。
- 每个直播群最多只能添加 10 个自定义标记。
- 通过 IM SDK 设置自定义标记类型为 uint32_t,必须大于等于 1000。
- 每次最多标记 100 名群成员。
- 被标记的群成员需要在线。当成员退群、掉线时标记信息会被清除。可以通过第三方回调在该成员进群、上线时重新设置标记。
群成员被标记后,可以调用 getGroupMemberList
,设置 filter
为所设置的自定义标记值,过滤出指定的群成员列表。
说明:
- 仅增强版 6.6 及以上版本支持。
- 标记直播群成员仅对旗舰版客户开放,详情请参考 基础服务详情。
- 如需使用此功能,您需要登录 即时通信 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 控制台 修改相关配置。
说明:
只有群主能将管理员禁言。
示例代码如下:
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) {
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();
}
}
}
});
[[V2TIMManager sharedInstance] muteGroupMember:@"groupA" member:@"user1" muteTime:60 succ:^{
} fail:^(int code, NSString *desc) {
}];
V2TIMGroupInfo *info = [[V2TIMGroupInfo alloc] init];
info.groupID = @"groupA";
info.allMuted = YES;
[[V2TIMManager sharedInstance] muteGroupMember:@"groupA" member:@"user1" muteTime:60 succ:^{
} fail:^(int code, NSString *desc) {
}];
[[V2TIMManager sharedInstance] addGroupListener:self];
(void)onMemberInfoChanged:(NSString *)groupID changeInfoList:(NSArray <V2TIMGroupMemberChangeInfo *> *)changeInfoList {
for (V2TIMGroupMemberChangeInfo *memberChangeInfo in changeInfoList) {
<span class="hljs-comment">// 被禁言用户 ID</span>
<span class="hljs-built_in">NSString</span> *userID = memberChangeInfo.userID;
<span class="hljs-comment">// 禁言时间</span>
uint32_t muteTime = memberChangeInfo.muteTime;
}
}
(void)onGroupInfoChanged:(NSString *)groupID changeInfoList:(NSArray <V2TIMGroupChangeInfo *> *)changeInfoList {
for (V2TIMGroupChangeInfo groupChangeInfo in changeInfoList) {
<span class="hljs-keyword">if</span> (groupChangeInfo.type == V2TIM_GROUP_INFO_CHANGE_TYPE_SHUT_UP_ALL) {
<span class="hljs-comment">// 是否全员禁言</span>
<span class="hljs-built_in">BOOL</span> isMuteAll = groupChangeInfo.boolValue;
}
}
}
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::<span class="hljs-built_in">move</span>(success_callback)
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback)
}
void OnSuccess() override {
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>();
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(error_code, error_message);
}
}
private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};
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);
V2TIMGroupInfo info;
info.groupID = "groupA";
info.allMuted = true;
info.modifyFlag = V2TIMGroupInfoModifyFlag::V2TIM_GROUP_INFO_MODIFY_FLAG_SHUTUP_ALL;
auto callback = new Callback;
callback->SetCallback(
= {
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
delete callback;
});
V2TIMManager::GetInstance()->GetGroupManager()->SetGroupInfo(info, callback);
class GroupListener final : public V2TIMGroupListener {
public:
GroupListener() = default;
~GroupListener() override = default;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnMemberInfoChanged</span><span class="hljs-params">(<span class="hljs-keyword">const</span> V2TIMString& groupID,
<span class="hljs-keyword">const</span> V2TIMGroupMemberChangeInfoVector& groupMemberChangeInfoList)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-comment">// 禁言群成员监听</span>
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">size_t</span> i = <span class="hljs-number">0</span>; i < groupMemberChangeInfoList.<span class="hljs-built_in">Size</span>(); ++i) {
<span class="hljs-keyword">const</span> V2TIMGroupMemberChangeInfo& groupMemberChangeInfo = groupMemberChangeInfoList[i];
<span class="hljs-comment">// 被禁言用户 ID</span>
V2TIMString userID = groupMemberChangeInfo.userID;
<span class="hljs-comment">// 禁言时间</span>
<span class="hljs-keyword">uint32_t</span> muteTime = groupMemberChangeInfo.muteTime;
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnGroupInfoChanged</span><span class="hljs-params">(<span class="hljs-keyword">const</span> V2TIMString& groupID,
<span class="hljs-keyword">const</span> V2TIMGroupChangeInfoVector& groupChangeInfoList)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-comment">// 全员禁言监听</span>
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">size_t</span> i = <span class="hljs-number">0</span>; i < groupChangeInfoList.<span class="hljs-built_in">Size</span>(); ++i) {
<span class="hljs-keyword">const</span> V2TIMGroupChangeInfo& groupChangeInfo = groupChangeInfoList[i];
<span class="hljs-keyword">if</span> (groupChangeInfo.type == V2TIMGroupInfoChangeType::V2TIM_GROUP_INFO_CHANGE_TYPE_SHUT_UP_ALL) {
<span class="hljs-comment">// 是否全员禁言</span>
<span class="hljs-keyword">bool</span> boolValue = groupChangeInfo.boolValue;
}
}
}
<span class="hljs-comment">// 其他成员 ...</span>
};
GroupListener groupListener;
V2TIMManager::GetInstance()->AddGroupListener(&groupListener);
踢人
群主或管理员调用 kickGroupMember
(Android / iOS & Mac / Windows) 接口可以将指定的群成员踢出群组。
群成员被踢后,全员(包括被踢的人)会收到 onMemberKicked
(Android / iOS & Mac / Windows) 回调。
说明:
普通群,只有群主能将管理员踢出群组。
对于直播群(AVChatRoom)而言:
- 增强版 6.6 以前,直播群不支持踢人。您可以使用
muteGroupMember
(Android / iOS & Mac / Windows) 禁言指定成员达到类似的成员管控的目的,禁言操作参考 禁言。
- 增强版 6.6 开始,直播群支持踢人。踢人接口及回调跟普通群一致。群成员被踢出直播群后,无法再加入该群,也不能再向群里发消息。直播群只有群主能踢人,管理员、普通成员均没有踢人权限。
注意:
- 直播群踢人仅对旗舰版客户开放,详情请参考 基础服务详情。
- 如需使用此功能,您需要登录 即时通信 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) {
}
});
[[V2TIMManager sharedInstance] kickGroupMember:@"groupA" memberList:@[@"user1"] reason:@"" succ:^(NSArray<V2TIMGroupMemberOperationResult *> *resultList) {
} fail:^(int code, NSString *desc) {
}];
[[V2TIMManager sharedInstance] addGroupListener:self];
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::<span class="hljs-built_in">move</span>(success_callback)
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback)
}
void OnSuccess(const T& value) override {
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>(value);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(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;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnMemberKicked</span><span class="hljs-params">(<span class="hljs-keyword">const</span> V2TIMString& groupID, <span class="hljs-keyword">const</span> V2TIMGroupMemberInfo& opUser,
<span class="hljs-keyword">const</span> V2TIMGroupMemberInfoVector& memberList)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-comment">// 群成员被踢通知</span>
}
<span class="hljs-comment">// 其他成员 ...</span>
};
GroupListener groupListener;
V2TIMManager::GetInstance()->AddGroupListener(&groupListener);
设置管理员
群主调用 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) {
}
});
[[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::<span class="hljs-built_in">move</span>(success_callback)
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback)
}
void OnSuccess() override {
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>();
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(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;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnGrantAdministrator</span><span class="hljs-params">(<span class="hljs-keyword">const</span> V2TIMString& groupID, <span class="hljs-keyword">const</span> V2TIMGroupMemberInfo& opUser,
<span class="hljs-keyword">const</span> V2TIMGroupMemberInfoVector& memberList)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-comment">// 被设置管理员通知</span>
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnRevokeAdministrator</span><span class="hljs-params">(<span class="hljs-keyword">const</span> V2TIMString& groupID, <span class="hljs-keyword">const</span> V2TIMGroupMemberInfo& opUser,
<span class="hljs-keyword">const</span> V2TIMGroupMemberInfoVector& memberList)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-comment">// 被取消管理员通知</span>
}
<span class="hljs-comment">// 其他成员 ...</span>
};
GroupListener groupListener;
V2TIMManager::GetInstance()->AddGroupListener(&groupListener);
转让群主
群主可以调用 transferGroupOwner
(Android / iOS & Mac / Windows) 把群主转让给其他群成员。
群主转让后,全员会收到 onGroupInfoChanged
(Android / iOS & Mac / Windows) 回调,其中 V2TIMGroupChangeInfo
的 type
为 V2TIMGroupChangeInfo.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) {
}
});
[[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&)>;
<span class="hljs-built_in">Callback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">Callback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">()</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>();
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(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) 可以获取群在线人数。
说明:
- 目前仅直播群(AVChatRoom)支持获取群在线人数。
- 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) {
}
});
[[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&)>;
<span class="hljs-built_in">ValueCallback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">ValueCallback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">(<span class="hljs-keyword">const</span> T& value)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>(value);
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(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);
本页内容是否解决了您的问题?