Managing group channels
This guide covers how to create groups, update group profiles, kick members, leave groups, dismiss groups, and transfer ownership using the Nexconn SDK.
Group event listener
Group events are defined in GroupChannelHandler, including group operations, group/member profile changes, membership request notifications, and cross-device favorites sync events.
- Kotlin
- Java
NCEngine.addGroupChannelHandler("GROUP_HANDLER", object : GroupChannelHandler {
override fun onGroupOperation(event: GroupOperationEvent) {
// Group operation callback: create, join, kick, leave, dismiss, add/remove admin, transfer, etc.
}
override fun onGroupInfoChanged(event: GroupInfoChangedEvent) {
// Group profile changed
}
override fun onGroupMemberInfoChanged(event: GroupMemberInfoChangedEvent) {
// Member profile changed
}
override fun onGroupApplicationEvent(event: GroupApplicationInfo) {
// Membership request event: join request or invite
}
override fun onGroupFavoritesChangedSync(event: GroupFavoritesChangedSyncEvent) {
// Cross-device favorites sync event
}
})
NCEngine.addGroupChannelHandler("GROUP_HANDLER", new GroupChannelHandler() {
@Override
public void onGroupOperation(GroupOperationEvent event) {
// Group operation callback
}
@Override
public void onGroupInfoChanged(GroupInfoChangedEvent event) {
// Group profile changed
}
@Override
public void onGroupMemberInfoChanged(GroupMemberInfoChangedEvent event) {
// Member profile changed
}
@Override
public void onGroupApplicationEvent(GroupApplicationInfo event) {
// Membership request event
}
@Override
public void onGroupFavoritesChangedSync(GroupFavoritesChangedSyncEvent event) {
// Cross-device favorites sync event
}
});
Remove listener
- Kotlin
- Java
NCEngine.removeGroupChannelHandler("GROUP_HANDLER")
NCEngine.removeGroupChannelHandler("GROUP_HANDLER");
Group operation SDK notification callbacks are also a form of status notification. Regardless of whether the app implements event listeners, the server syncs status to the SDK to ensure local data is up to date. These notifications count toward message distribution and downstream statistics.
Group management
Group management includes: creating groups, updating profiles, kicking members, leaving groups, dismissing groups, and transferring ownership.
Create a group
Call GroupChannel.createGroup() to create a new group.
Kotlin (recommended)
- Kotlin
- Java
val params = CreateGroupParams(
groupId = "group_123",
groupName = "Tech Discussion",
inviteeUserIds = listOf("userId1", "userId2", "userId3")
).apply {
portraitUri = "https://example.com/group-avatar.png"
introduction = "A group for technical discussions"
notice = "Welcome to the group"
joinPermission = GroupJoinPermission.OWNER_VERIFY
removeMemberPermission = GroupOperationPermission.OWNER_AND_ADMIN
invitePermission = GroupOperationPermission.ALL
}
GroupChannel.createGroup(params) { resultCode, error ->
if (error == null) {
// Created successfully
} else {
// Creation failed: ${error.message}
}
}
CreateGroupParams params = new CreateGroupParams(
"group_123",
"Tech Discussion",
Arrays.asList("userId1", "userId2", "userId3")
);
params.setPortraitUri("https://example.com/group-avatar.png");
params.setIntroduction("A group for technical discussions");
params.setNotice("Welcome to the group");
params.setJoinPermission(GroupJoinPermission.OWNER_VERIFY);
params.setRemoveMemberPermission(GroupOperationPermission.OWNER_AND_ADMIN);
params.setInvitePermission(GroupOperationPermission.ALL);
GroupChannel.createGroup(params, new OperationHandler<Integer>() {
@Override
public void onResult(Integer resultCode, NCError error) {
if (error == null) {
// Created successfully
} else {
// Creation failed
}
}
});
Group profile parameters
| Property | Type | Required | Description |
|---|---|---|---|
| groupId | String | Yes | Group ID. Max 64 characters. Alphanumeric only. |
| groupName | String | Yes | Group name. Max 64 characters. |
| portraitUri | String | No | Group avatar URL. Max 128 characters. |
| introduction | String | No | Group description. Max 512 characters. |
| notice | String | No | Group notice/announcement. Max 1024 characters. |
| extProfile | Map<String, String> | No | Custom extension fields. Up to 10. Must be configured in the Console first. |
| joinPermission | GroupJoinPermission | No | Join permission: no verification, owner approval (default), owner+admin approval, or no one allowed. |
| removeMemberPermission | GroupOperationPermission | No | Kick permission: owner only (default), owner+admin, or all members. |
| invitePermission | GroupOperationPermission | No | Invite permission: owner only (default), owner+admin, or all members. |
| inviteHandlePermission | GroupInviteHandlePermission | No | Whether invitees must accept: no approval needed (default), or invitee must accept. |
| groupInfoEditPermission | GroupOperationPermission | No | Profile edit permission: owner only (default), owner+admin, or all. Only the owner can change this. |
| memberInfoEditPermission | GroupMemberInfoEditPermission | No | Member profile edit permission: self only, owner+self, or owner+admin+self (default). |
inviteeUserIds Parameter
You can invite users when creating the group. Maximum 30 users per invitation.
The result depends on the inviteHandlePermission setting:
- If invitee approval is required, invitees receive an
onGroupApplicationEventand must accept before joining. - If no approval is required, invitees are added directly.
- A successful callback means the group was created successfully.
- On creation, the owner receives an
onGroupOperationcallback withGroupOperationtypeCreate.
Update group profile
Call groupChannel.updateGroupInfo() to update the group name, notice, permissions, or other profile fields. Only groupId is required; the API updates only the fields you provide.
- After a successful update, all channel members receive an
onGroupInfoChangedcallback. - Edit permission is controlled by
groupInfoEditPermission. Only the channel owner can change this permission.
- Kotlin
- Java
val groupChannel = GroupChannel("groupId")
val params = UpdateGroupInfoParams().apply {
groupName = "New Group Name"
notice = "New group notice"
}
groupChannel.updateInfo(params) { errorKeys, error ->
if (error == null) {
// Updated successfully
} else {
// Update failed. errorKeys contains the failed field names.
}
}
GroupChannel groupChannel = new GroupChannel("groupId");
UpdateGroupInfoParams params = new UpdateGroupInfoParams();
params.setGroupName("New Group Name");
params.setNotice("New group notice");
groupChannel.updateInfo(params, new ErrorDetailHandler<List<String>>() {
@Override
public void onError(List<String> detail, NCError error) {
if (error == null) {
// Updated successfully
} else {
// Update failed. detail contains the failed field names.
}
}
});
Kick members
Call groupChannel.kickMembers() to remove users from the group. Supports batch removal of up to 100 users at once.
Use LeaveGroupConfig to control whether to also remove Favorites (followed users), allowed senders list entries, and mute status. By default, all are removed.
The removeMemberPermission setting determines whether the caller has kick permission.
On success, all channel members receive an onGroupOperation callback with GroupOperation type Kick.
- Kotlin
- Java
val groupChannel = GroupChannel("groupId")
val config = LeaveGroupConfig().apply {
isRemoveFollow = false
isRemoveWhiteList = false
isRemoveMuteStatus = false
}
val params = KickGroupMembersParams(listOf("userId1", "userId2", "userId3")).apply {
this.config = config
}
groupChannel.kickMembers(params) { error ->
if (error == null) {
// Kick succeeded
} else {
// Kick failed: ${error.message}
}
}
GroupChannel groupChannel = new GroupChannel("groupId");
LeaveGroupConfig config = new LeaveGroupConfig();
config.setRemoveFollow(false);
config.setRemoveWhiteList(false);
config.setRemoveMuteStatus(false);
List<String> userIds = Arrays.asList("userId1", "userId2", "userId3");
KickGroupMembersParams params = new KickGroupMembersParams(userIds);
params.setConfig(config);
groupChannel.kickMembers(params, error -> {
if (error == null) {
// Kick succeeded
} else {
// Kick failed
}
});
Leave a group
Call groupChannel.leave() to leave a group voluntarily.
Use LeaveGroupConfig to control whether to also remove Favorites, allowed senders list entries, and mute status. By default, all are removed on leave.
On success, all channel members receive an onGroupOperation callback with GroupOperation type Quit.
- Kotlin
- Java
val groupChannel = GroupChannel("groupId")
val config = LeaveGroupConfig().apply {
isRemoveFollow = false
isRemoveWhiteList = false
isRemoveMuteStatus = false
}
groupChannel.leave(config) { error ->
if (error == null) {
// Left successfully
} else {
// Leave failed: ${error.message}
}
}
GroupChannel groupChannel = new GroupChannel("groupId");
LeaveGroupConfig config = new LeaveGroupConfig();
config.setRemoveFollow(false);
config.setRemoveWhiteList(false);
config.setRemoveMuteStatus(false);
groupChannel.leave(config, error -> {
if (error == null) {
// Left successfully
} else {
// Leave failed
}
});
Dismiss a group
Call groupChannel.dismiss() to dismiss a group. Messages in the channel are preserved locally after dismissal.
- Only the channel owner can dismiss a group.
- On success, all members receive an
onGroupOperationcallback withGroupOperationtypeDismiss.
- Kotlin
- Java
val groupChannel = GroupChannel("groupId")
groupChannel.dismiss { error ->
if (error == null) {
// Dismissed successfully
} else {
// Dismiss failed: ${error.message}
}
}
GroupChannel groupChannel = new GroupChannel("groupId");
groupChannel.dismiss(error -> {
if (error == null) {
// Dismissed successfully
} else {
// Dismiss failed
}
});
Transfer ownership
Call groupChannel.transferOwner() to transfer the channel owner role to another user.
You can choose whether to leave the group after the transfer (quitGroup). If set to true, use LeaveGroupConfig to control cleanup behavior.
On success, all members receive an onGroupOperation callback with type TransferGroupOwner. If you also chose to leave, an additional Quit event is sent.
Only the channel owner can transfer ownership.
- Kotlin
- Java
val groupChannel = GroupChannel("groupId")
val config = LeaveGroupConfig().apply {
isRemoveFollow = false
isRemoveWhiteList = false
isRemoveMuteStatus = false
}
val params = TransferGroupOwnerParams("userId1").apply {
leaveAfterTransfer = true
this.config = config
}
groupChannel.transferOwner(params) { error ->
if (error == null) {
// Transfer succeeded
} else {
// Transfer failed: ${error.message}
}
}
GroupChannel groupChannel = new GroupChannel("groupId");
LeaveGroupConfig config = new LeaveGroupConfig();
config.setRemoveFollow(false);
config.setRemoveWhiteList(false);
config.setRemoveMuteStatus(false);
TransferGroupOwnerParams params = new TransferGroupOwnerParams("userId1");
params.setLeaveAfterTransfer(true);
params.setConfig(config);
groupChannel.transferOwner(params, error -> {
if (error == null) {
// Transfer succeeded
} else {
// Transfer failed
}
});