Android

频道管理

更新时间: 2024/11/21 17:47:20

NIM SDK 的 QChatChannelService 类提供管理频道的方法,支持创建、修改、查询和删除频道。

前提条件

根据本文操作前,请确保您已经完成以下操作:

使用限制

单个服务器的频道数量上限默认为 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):
  • MessageChannel:消息频道
  • MessageChannel实时互动频道
  • CustomChannel:自定义频道
void setViewMode 设置频道的查看模式(QChatChannelMode),包括:
  • PRIVIATE:私密模式,该模式下,频道只对该频道白名单中的用户可见
  • PUBLIC:公开模式,该模式下,频道对未被加入该频道的黑名单的用户均可见
  • 频道黑白名单相关说明,请参考 频道黑白名单

如果设置为同步模式(QChatChannelSyncMode.SYNC),那么无法单独设置频道的查看模式(该情况下设置了查看模式将会报 414 错误)。同步模式与频道分组相关,详情请参考 频道分组与频道的关联逻辑
void setCategoryId 通过传入频道分组的 ID 为频道指定其所属的分组,频道分组详情请参考 频道分组
void setSycnMode 设置频道的同步模式(QChatChannelSyncMode):
  • NONE:不同步频道分组的配置
  • SYNC:同步频道分组的配置,具体同步的数据包括查看模式(私密或公开)、黑白名单和身份组权限
只有将同步模式设置为不同步,才能单独设置频道的查看模式 QChatChannelMode
void setAntiSpamConfig 设置频道资料内容的内容审核(反垃圾)配置(QChatAntiSpamConfig),更多相关说明请参考 圈组内容审核
void setVisitorMode 设置频道是否对 游客 可见:
  • VISIBLE:可见
  • INVISIBLE:不可见
  • FOLLOW:跟随模式(默认),即如果该频道的查看模式(viewMode)被设置为 公开 则该频道对游客可见,如果被设置为 私密 则对游客不可见
如果频道的 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。

更多圈组内容审核相关说明,参考 圈组内容审核

此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 使用限制
  • API 调用时序
  • 创建频道
  • 修改频道
  • 删除频道
  • 查询频道
  • 分页查询频道列表
  • 根据频道 ID 查询频道列表
  • 分页查询未在频道分组下的频道
  • 分页查询频道成员列表
  • 查询频道未读信息
  • 系统通知
  • 内容审核