Android

频道管理

更新时间: 2024/07/04 19:10:28

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

前提条件

使用限制

单个服务器的频道数量上限默认为 100 个。

若需要扩展上限,可在控制台配置圈组子功能项(单 server 可创建的 channel 数),具体请参考开通和配置圈组功能

实现方法

创建频道

调用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)变更后,该频道对游客的可见性也将变更。例如,在这种情况下,频道分组的查看模式由公开变为私密,则此时该频道对游客从“可见”变为“不可见”。

示例代码如下:

//建立一个消息类型的频道
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),内容审核详情请参见圈组内容审核

示例代码如下:

QChatUpdateChannelParam 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)。

示例代码如下:

NIMClient.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方法分页查询频道列表。

示例代码如下:

NIMClient.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列表l失败,返回错误code
            }

            @Override
            public void onException(Throwable exception) {
                //查询Channel列表异常
            }
        });

根据频道 ID 查询频道列表

用户进入服务器后,如果想要检索当前服务器的频道,可调用getChannels方法根据频道的 ID 进行检索。

示例代码如下:

List<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列表l失败,返回错误code
            }

            @Override
            public void onException(Throwable exception) {
                //查询Channel列表异常
            }
        });

分页查询未在频道分组下的频道

用户进入服务器后,如果想要检索当前服务器中不在频道分组下的频道,可调用 getUncategorizedChannelsByPage 方法进行查询。

可以指定根据自定义权重顺序返回,也可以全量返回。(该接口支持分页查询。)

示例代码如下:

//服务器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。


示例代码如下:

QChatGetChannelMembersByPageParam 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 修改频道信息

更多圈组系统通知相关说明,请参见圈组系统通知相关

API 调用时序

下图可能因为网络问题显示异常,如显示异常,一般刷新当前页面即可正常显示。

uml diagram

上图中:

相关内容审核

创建或修改频道时,如果通过setAntiSpamBusinessId方法配置了安全通的业务 ID, 那么云信将会对频道资料(如频道名称和图标)进行“安全通”内容审核。antiSpamBusinessId代表安全通默认内容审核业务以外的自定义内容审核的业务 ID;如需新增自定义内容审核,请联系商务经理进行相关配置,然后前往云信控制台的安全通配置界面获取该业务 ID。

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

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