IM 即时通讯
Android
开发指南

频道分组身份组

更新时间: 2023/09/22 15:52:52

本文以多用户交互的典型场景为例,介绍在频道分组维度对用户进行权限控制的实现方法和示例代码。

技术原理

网易云信即时通讯 NIM Android SDK 的QChatRoleService接口提供管理频道分组身份组的相关方法,助您快速实现在频道分组维度对不同用户的权限控制。 调用管理频道分组身份组的相关方法,需要管理角色的权限(即QChatRoleResource枚举中的MANAGE_ROLE)。

新创建的频道分组身份组的权限设置,默认继承自指定的服务器身份组(通过服务器身份组的 ID 指定)。如果需要在频道分组维度设置和服务器维度有区分的用户权限,需在创建频道分组身份组后调用 updateChannelCategoryRole 方法对权限做更改;或者调用addChannelCategoryMemberRole方法创建成员在频道分组的定制权限,再调用updateChannelCategoryMemberRole方法设置具体的权限。

频道分组身份组.png

实现方法

本节以服务器所有者和服务器成员的交互为例(服务器成员仅被授予管理角色权限的场景),介绍服务器成员创建频道分组身份组的实现流程。

  • 服务器所有者可以在创建服务器和频道分组后直接调用addChannelCategoryRole方法创建频道分组身份组。
  • 用户创建频道分组身份组后, 可更新、删除、查询频道分组身份组,相关方法请参见本文的API参考
  • 服务器成员创建频道分组某人的定制权限的实现,可参考本场景的流程。

前提条件

已创建服务器。

实现流程

  1. 服务器所有者调用addMembersToServerRole方法,将服务器成员加入身份组。

  2. 服务器所有者调用updateServerRole方法,授予该身份组管理角色的权限。

    结果

    服务器成员将拥有管理角色的权限。

  3. 服务器所有者调用createChannelCategory方法,创建频道分组。

  4. 如果创建的是私密频道分组,服务器所有者需调用 updateChannelCategoryBlackWhiteMembers方法,将该成员加入频道分组白名单。

    如果创建的是公开频道分组,请跳过这一步。

  5. 服务器成员调用getServerRoles方法获取目标服务器身份组的 ID。

    如果服务器成员在服务器维度没有管理角色的权限,但在频道分组维度有该权限时,调用getServerRoles方法时传入频道分组 ID(categoryId)才能查询服务器的身份组列表,进而获取目标服务器身份组 ID。

  6. 服务器成员调用addChannelCategoryRole方法,创建频道分组身份组。

    入参
    类型
    是否必传 说明
    serverId long 频道分组所在的服务器的 ID
    serverRoleId long 服务器身份组 ID。生成的频道分组身份组从该服务器身份组继承,以此 ID 作为频道身份组的parentRoleId
    categoryId long 频道分组 ID

    服务器成员可通过圈组的内置系统通知(QChatSystemNotificationType枚举中的CHANNEL_CATEGORY_CREATE)获知categoryId。如服务器成员人数超过目前默认的阈值 2,000(可联系商务经理调整),成员需调用subscribeServer方法订阅服务器才能接收到该系统通知。服务器成员人数在阈值内,则不需要订阅服务器也能接收到。

API 调用时序图

uml diagram

示例代码

//************************1.将服务器成员加入身份组************************/
//服务器Id
long serviceId = 2114708;
//服务器身份组Id
long roleId = 21343;
//需要加入服务器的成员账户
String accid = "test1";
List<String> accidList = new ArrayList<>();
accidList.add(accid);

QChatAddMembersToServerRoleParam addMembersToServerRoleParam = new QChatAddMembersToServerRoleParam(serviceId,roleId,accidList);
NIMClient.getService(QChatRoleService.class).addMembersToServerRole(addMembersToServerRoleParam).setCallback(
        new RequestCallback<QChatAddMembersToServerRoleResult>() {
            @Override
            public void onSuccess(QChatAddMembersToServerRoleResult result) {
                List<String> failedAccids = result.getFailedAccids();
                //如果失败列表中成员accid,表示成功了
                if(!failedAccids.contains(accid)){
                    //成功的UI操作
                }
            }

            @Override
            public void onFailed(int code) {

            }

            @Override
            public void onException(Throwable exception) {

            }
        });

//************************2.授予该身份组管理频道权限************************/
//如果该身份组没有管理频道权限,则授予该身份组管理频道权限
QChatUpdateServerRoleParam updateServerRoleParam = new QChatUpdateServerRoleParam(serviceId,roleId);
//开启管理频道权限
Map<QChatRoleResource, QChatRoleOption> resourceAuths = new HashMap<>();
resourceAuths.put(QChatRoleResource.MANAGE_CHANNEL,QChatRoleOption.ALLOW);
updateServerRoleParam.setResourceAuths(resourceAuths);

NIMClient.getService(QChatRoleService.class).updateServerRole(updateServerRoleParam).setCallback(
        new RequestCallback<QChatUpdateServerRoleResult>() {
            @Override
            public void onSuccess(QChatUpdateServerRoleResult result) {
                //  返回更新后的服务器身份组
                QChatServerRole role = result.getRole();
            }

            @Override
            public void onFailed(int code) {

            }

            @Override
            public void onException(Throwable exception) {

            }
        });

//************************3.创建频道分组************************/
QChatCreateChannelCategoryParam categoryParam = new QChatCreateChannelCategoryParam(serviceId);
categoryParam.setName("频道分组名称");
categoryParam.setCustom("频道分组自定义扩展字段");
//设置频道查看模式为私密模式
categoryParam.setViewMode(QChatChannelMode.PRIVATE);
NIMClient.getService(QChatChannelService.class).createChannelCategory(categoryParam).setCallback(
        new RequestCallback<QChatCreateChannelCategoryResult>() {
            @Override
            public void onSuccess(QChatCreateChannelCategoryResult result) {
                //返回创建好的频道分组
                QChatChannelCategory category = result.getCategory();
            }

            @Override
            public void onFailed(int code) {

            }

            @Override
            public void onException(Throwable exception) {

            }
        });

//************************4.将该成员加入频道分组白名单************************/
long categoryId = 17790;
QChatUpdateChannelCategoryBlackWhiteMembersParam updateChannelCategoryBlackWhiteMembersParam = new QChatUpdateChannelCategoryBlackWhiteMembersParam(serviceId,categoryId,
        QChatChannelBlackWhiteType.WHITE, QChatChannelBlackWhiteOperateType.ADD,accidList);
NIMClient.getService(QChatChannelService.class).updateChannelCategoryBlackWhiteMembers(updateChannelCategoryBlackWhiteMembersParam).setCallback(
        new RequestCallback<Void>() {
            @Override
            public void onSuccess(Void result) {
                //加入白名单成功
            }

            @Override
            public void onFailed(int code) {

            }

            @Override
            public void onException(Throwable exception) {

            }
        });

//************************5.查询服务器下身份组列表************************/
QChatGetServerRolesParam getServerRolesParam = new QChatGetServerRolesParam(serviceId,0,100);
getServerRolesParam.setCategoryId(categoryId);
NIMClient.getService(QChatRoleService.class).getServerRoles(getServerRolesParam).setCallback(
        new RequestCallback<QChatGetServerRolesResult>() {
            @Override
            public void onSuccess(QChatGetServerRolesResult result) {
                //返回服务器身份组列表
                List<QChatServerRole> roleList = result.getRoleList();
            }

            @Override
            public void onFailed(int code) {

            }

            @Override
            public void onException(Throwable exception) {

            }
        });

//************************6.创建频道分组身份组************************/
QChatAddChannelCategoryRoleParam addChannelCategoryRoleParam = new QChatAddChannelCategoryRoleParam(serviceId,categoryId,roleId);
NIMClient.getService(QChatRoleService.class).addChannelCategoryRole(addChannelCategoryRoleParam).setCallback(
        new RequestCallback<QChatAddChannelCategoryRoleResult>() {
            @Override
            public void onSuccess(QChatAddChannelCategoryRoleResult result) {
                //返回创建成功的频道分组身份组
                QChatChannelCategoryRole role = result.getRole();
            }

            @Override
            public void onFailed(int code) {

            }

            @Override
            public void onException(Throwable exception) {

            }
        });
此文档是否对你有帮助?
有帮助
去反馈
  • 技术原理
  • 实现方法
  • 前提条件
  • 实现流程
  • API 调用时序图
  • 示例代码