频道管理
更新时间: 2024/11/21 17:47:20
NIM SDK 的 QChatChannelService
类提供管理频道的方法,支持创建、修改、查询和删除频道。
前提条件
根据本文操作前,请确保您已经完成以下操作:
-
注册
observeReceiveSystemNotification
监听圈组的系统通知。示例代码参考 圈组系统通知收发。具体 与频道管理相关 的系统通知类型,见本文末尾的 相关系统通知。
-
拥有 管理频道的权限(
QChatRoleResource.MANAGE_CHANNEL
)才能创建、修改和删除频道。权限通过身份组进行配置和管理,具体请参考 身份组概述 及其他身份组相关文档。
使用限制
单个服务器的频道数量上限默认为 100 个。
若需要扩展上限,可在 网易云信控制台 配置圈组子功能项(单 server 可创建的 channel 数),具体请参考 开通和配置圈组功能。
API 调用时序
sequenceDiagram
par 注册监听并登录圈组
频道创建者 ->> NIM SDK: 监听圈组系统通知<br>(observeReceiveSystemNotification)
普通频道成员 ->> NIM SDK: 监听圈组系统通知<br>(observeReceiveSystemNotification)
频道创建者 ->> NIM SDK: 登录圈组<br>(login)
普通频道成员 ->> NIM SDK: 登录圈组<br>(login)
end
note over NIM SDK: 用户提前进入<br>同一个圈组服务器
par 创建频道
频道创建者 ->> NIM SDK: 创建频道<br>(createChannel)
note over 频道创建者: 创建频道需拥有<br>MANAGE_CHANNEL 权限
NIM SDK -->> 频道创建者: 频道创建成功的通知<br>(CHANNEL_CREATE)
end
par 普通频道成员订阅频道
普通频道成员 ->> NIM SDK: 订阅频道<br>(subscribeChannel)
note over 普通频道成员: 普通成员需订阅频道且在线<br>才能收到频道相关系统通知
end
par 修改频道
频道创建者 ->> NIM SDK: 修改频道<br>(updateChannel)
note over 频道创建者: 修改频道需要拥有<br>MANAGE_CHANNEL 权限
NIM SDK -->> 频道创建者: 频道修改成功的通知<br>(CHANNEL_UPDATE)
NIM SDK -->> 普通频道成员: 频道修改成功的通知<br>(CHANNEL_UPDATE)
note over 普通频道成员: 普通成员需订阅频道且在线<br> 才能收到该通知
end
par 删除频道
频道创建者 ->> NIM SDK: 删除频道<br>(deleteChannel)
note over 频道创建者: 删除频道需要拥有<br>MANAGE_CHANNEL 权限
NIM SDK -->> 频道创建者: 频道删除成功的通知<br>(CHANNEL_REMOVE)
NIM SDK -->> 普通频道成员: 频道修改成功的通知<br>(CHANNEL_REMOVE)
note over 普通频道成员: 普通成员需订阅频道且在线<br> 才能收到该通知
end
上图中:
创建频道
调用 createChannel
方法在某个服务器下创建频道。调用时需要传入服务器 ID (serverId
)、频道名称(name
)和频道类型(type
)。
该方法的入参结构为 QChatCreateChannelParam
,其重要内置方法说明如下:
返回类型 |
方法 | 说明 |
---|---|---|
void | getType |
获取频道类型(QChatChannelType ):
|
void | setViewMode |
设置频道的查看模式(QChatChannelMode ),包括:
频道黑白名单相关说明,请参考 频道黑白名单 QChatChannelSyncMode.SYNC ),那么无法单独设置频道的查看模式(该情况下设置了查看模式将会报 414 错误)。同步模式与频道分组相关,详情请参考 频道分组与频道的关联逻辑。 |
void | setCategoryId |
通过传入频道分组的 ID 为频道指定其所属的分组,频道分组详情请参考 频道分组 |
void | setSycnMode |
设置频道的同步模式(QChatChannelSyncMode ):
QChatChannelMode 。 |
void | setAntiSpamConfig |
设置频道资料内容的内容审核(反垃圾)配置(QChatAntiSpamConfig ),更多相关说明请参考 圈组内容审核 |
void | setVisitorMode |
设置频道是否对 游客 可见:
visitorMode 为跟随模式,且同步模式(syncMode)为 与频道分组同步,则当该频道所属的频道分组的查看模式(viewMode )变更后,该频道对游客的可见性也将变更。例如,在这种情况下,频道分组的查看模式由公开变为私密,则此时该频道对游客从 可见 变为 不可见。 |
示例代码如下:
Java//建立一个消息类型的频道
QChatCreateChannelParam param = new QChatCreateChannelParam(943445L, "测试频道", QChatChannelType.MessageChannel);
param.setCustom("自定义扩展");
param.setTopic("主题");
//设置频道为公开频道
param.setViewMode(QChatChannelMode.PUBLIC);
QChatAntiSpamConfig antiSpamConfig = new QChatAntiSpamConfig("用户配置的对某些资料内容另外的反垃圾的业务 ID");
param.setAntiSpamBusinessId(antiSpamConfig);
NIMClient.getService(QChatChannelService.class).createChannel(param).setCallback(
new RequestCallback<QChatCreateChannelResult>() {
@Override
public void onSuccess(QChatCreateChannelResult result) {
//创建 Channel 成功,返回创建成功的 Channel 信息
QChatChannel channel = result.getChannel();
}
@Override
public void onFailed(int code) {
//创建 Channel 失败,返回错误 code
}
@Override
public void onException(Throwable exception) {
//创建 Channel 异常
}
});
修改频道
调用 updateChannel
方法修改某个频道的信息,如频道名称、频道主题、对游客是否可见、自定义扩展字段等。调用时需要传入待修改的频道的 ID(channelId
)。
调用该方法时,您可设置频道资料的内容审核(反垃圾)配置(QChatAntiSpamConfig
),内容审核详情请参考 圈组内容审核。
示例代码如下:
JavaQChatUpdateChannelParam param = new QChatUpdateChannelParam(885305L);
param.setName("测试修改名称");
param.setCustom("修改自定义扩展");
param.setTopic("修改主题");
//修改查看模式为私密的
param.setViewMode(QChatChannelMode.PRIVATE);
QChatAntiSpamConfig antiSpamConfig = new QChatAntiSpamConfig("用户配置的对某些资料内容另外的反垃圾的业务 ID");
param.setAntiSpamBusinessId(antiSpamConfig);
NIMClient.getService(QChatChannelService.class).updateChannel(param).setCallback(
new RequestCallback<QChatUpdateChannelResult>() {
@Override
public void onSuccess(QChatUpdateChannelResult result) {
//修改 Channel 成功,返回修改成功的 Channel 信息
QChatChannel channel = result.getChannel();
}
@Override
public void onFailed(int code) {
//修改 Channel 失败,返回错误 code
}
@Override
public void onException(Throwable exception) {
//修改 Channel 异常
}
});
删除频道
调用 deleteChannel
方法可将某个频道删除。调用时需传入待删除频道的 ID(channelId
)。
示例代码如下:
JavaNIMClient.getService(QChatChannelService.class).deleteChannel("new QChatDeleteChannelParam(885305L)).setCallback(
new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
//删除 Channel 成功
}
@Override
public void onFailed(int code) {
//删除 Channel 失败,返回错误 code
}
@Override
public void onException(Throwable exception) {
//删除 Channel 异常
}
});
查询频道
分页查询频道列表
用户进入服务器后,如果想要获取当前服务器已有(且对该用户可见)的频道,可调用 getChannelsByPage
方法分页查询频道列表。
示例代码如下:
JavaNIMClient.getService(QChatChannelService.class).getChannelsByPage(new QChatGetChannelsByPageParam(943445L,System.currentTimeMillis(),100)).setCallback(
new RequestCallback<QChatGetChannelsByPageResult>() {
@Override
public void onSuccess(QChatGetChannelsByPageResult result) {
//查询 Channel 列表成功
List<QChatChannel> channels = result.getChannels();
}
@Override
public void onFailed(int code) {
//查询 Channel 列表失败,返回错误 code
}
@Override
public void onException(Throwable exception) {
//查询 Channel 列表异常
}
});
根据频道 ID 查询频道列表
用户进入服务器后,如果想要检索当前服务器的频道,可调用 getChannels
方法根据频道的 ID 进行检索。
示例代码如下:
JavaList<Long> channelIds = new ArrayList<>();
channelIds.add(885305L);
NIMClient.getService(QChatChannelService.class).getChannels(new QChatGetChannelsParam(channelIds)).setCallback(
new RequestCallback<QChatGetChannelsResult>() {
@Override
public void onSuccess(QChatGetChannelsResult result) {
//查询 Channel 列表成功
List<QChatChannel> channels = result.getChannels();
}
@Override
public void onFailed(int code) {
//查询 Channel 列表失败,返回错误 code
}
@Override
public void onException(Throwable exception) {
//查询 Channel 列表异常
}
});
分页查询未在频道分组下的频道
用户进入服务器后,如果想要检索当前服务器中不在频道分组下的频道,可调用 getUncategorizedChannelsByPage
方法进行查询。
可以指定根据自定义权重顺序返回,也可以全量返回。(该接口支持分页查询。)
示例代码如下:
Java//服务器 ID
long serverId = 12345678L;
//分页标记,第一页不传,翻下一页传接口返回的 cursor
String cursor = null;
//查询数量
int limit = 100;
QChatGetUncategorizedChannelsByPageParam param = new QChatGetUncategorizedChannelsByPageParam(serverId,cursor,limit);
NIMClient.getService(QChatChannelService.class).getUncategorizedChannelsByPage(param).setCallback(new RequestCallback<QChatGetUncategorizedChannelsByPageResult>() {
@Override
public void onSuccess(QChatGetUncategorizedChannelsByPageResult result) {
//查询成功
//查询到的频道列表
List<QChatChannel> channels = result.getChannels();
//下一页查询标记
String nextCursor = result.getCursor();
}
@Override
public void onFailed(int code) {
//查询失败
}
@Override
public void onException(Throwable exception) {
//查询异常
}
});
分页查询频道成员列表
用户进入频道后,如果想要检索当前频道的成员有哪些(换而言之,当前频道对哪些用户可见),可调用 getChannelMembersByPage
方法可分页查询频道成员列表。
如果需要查询当前时间,timeTag
请务必传 0。
示例代码如下:
JavaQChatGetChannelMembersByPageParam queryParam = new QChatGetChannelMembersByPageParam(getLong(this,SP_SERVERID),getLong(this,SP_CHANNELID),System.currentTimeMillis());
queryParam.setLimit(100);
NIMClient.getService(QChatChannelService.class).getChannelMembersByPage(queryParam).setCallback(new RequestCallback<QChatGetChannelMembersByPageResult>() {
查询频道未读信息
用户进入服务器后,如果想获取频道的未读信息(包括未读数和未读状态),可调用 getChannelUnreadInfos
方法进行查询。
更多频道未读数相关说明,参考 频道未读数管理。
该方法单次最多查询频道数量为 100。
系统通知
圈组系统通知的类型在 QChatSystemNotificationType
枚举中定义,与频道管理相关的内置系统通知类型如下:
枚举值 | 说明 |
---|---|
CHANNEL_CREATE |
创建频道 |
CHANNEL_REMOVE |
删除频道 |
CHANNEL_UPDATE |
修改频道信息 |
更多圈组系统通知相关说明,请参考 圈组系统通知相关。
内容审核
创建或修改频道时,如果通过 setAntiSpamBusinessId
方法配置了安全通的业务 ID,那么网易云信将会对频道资料(如频道名称和图标)进行 安全通 内容审核。antiSpamBusinessId
代表安全通默认内容审核业务以外的自定义内容审核的业务 ID。如需新增自定义内容审核,请联系商务经理进行相关配置,然后前往网易云信控制台的安全通配置界面获取该业务 ID。
更多圈组内容审核相关说明,参考 圈组内容审核。