Skip to main content

Group Management

This document guides developers on using RC's Android IMLib SDK to implement group management features including:

  • Joining groups actively
  • Inviting users to join groups
  • Users accepting or rejecting group invitations
  • Administrators approving or rejecting group join requests
tip

This feature is supported starting from version 5.12.0.

Enabling the Service

Before using this feature, you must enable the profile hosting service by submitting a ticket.

Group Management

Group management includes:

  • Actively joining groups
  • Inviting users to join groups
  • Users accepting or rejecting group invitations
  • Administrators approving or rejecting group join requests

Actively Join Group

Call the joinGroup method to actively join a group.

The result depends on the group's join permission joinPermission, with two possible scenarios:

  1. When join permission is Requires group owner/administrator approval, successful API call returns RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT (25424) in IRongCoreEnum.CoreErrorCode, indicating pending approval. Both the requester and group owner/administrator receive onGroupApplicationEvent callback.
  2. When join permission is No approval needed, successful API call returns SUCCESS (0) in IRongCoreEnum.CoreErrorCode, indicating successful join. Both the requester and all group members receive onGroupOperation callback with Join operation type.

Code Example

// Group ID
String groupId = "groupId1";
RongCoreClient.getInstance().joinGroup(groupId, new IRongCoreCallback.ResultCallback<IRongCoreEnum.CoreErrorCode>() {
@Override
public void onSuccess(IRongCoreEnum.CoreErrorCode processCode) {
// Group join request successful
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// Group join request failed
}
});

Invite Users to Group

This feature is subject to group invite role permission invitePermission. Only users with permission can call inviteUsersToGroup to invite others.

Code Example

// Group ID
String groupId = "groupId1";
// User ID list
List<String> userIds = new ArrayList<>();
userIds.add("userId1");
userIds.add("userId2");
userIds.add("userId3");
RongCoreClient.getInstance().inviteUsersToGroup(groupId, userIds, new IRongCoreCallback.ResultCallback<IRongCoreEnum.CoreErrorCode>() {
@Override
public void onSuccess(IRongCoreEnum.CoreErrorCode processCode) {
// Group invitation successful
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// Group invitation failed
}
});

Group invitation behavior depends on three factors:

  1. Join permission ([joinPermission]): Whether group owner/administrator approval is required
  2. Inviter role ([role]): Whether inviter is group owner/administrator or regular member
  3. Invitee handling permission ([inviteHandlePermission]): Whether invitee consent is required

Specific Rules

tip

The table below assumes group invite permission [invitePermission] is set to Everyone (all members can invite others).

You can configure different permissions based on actual needs.

Join PermissionInviter RoleInvitee ApprovalEvent Flow
Requires owner/admin approvalRegular memberRequiredFlow A
Not requiredFlow B
Owner or adminRequiredFlow C
Not requiredFlow D
No approval neededAll rolesRequiredFlow C
Not requiredFlow D
Event Flows
Flow B

Permission scenario:

  • Regular member invites others
  • Requires owner/administrator approval
  • Doesn't require invitee approval
  1. After sending invitation, successful callback returns RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT (25424) in IRongCoreEnum.CoreErrorCode, indicating pending approval. Both inviter and owner/administrator receive onGroupApplicationEvent callback.

  2. After owner/administrator approves, invitee joins group successfully. Inviter and owner/administrator receive onGroupApplicationEvent callback. All group members receive onGroupOperation callback with Join operation type.

  3. After sending the invitation, the successful callback returns RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT (25424) in IRongCoreEnum.CoreErrorCode, indicating pending approval from the group owner/administrator. Both the inviter and group owner/administrator receive the onGroupApplicationEvent callback.

  4. After the group owner/administrator approves, the invitee successfully joins the group. The inviter and group owner/administrator receive the onGroupApplicationEvent callback. All group members receive the onGroupOperation callback with Join operation type.

Process C

Permission description:

  • Users with any role (group owner, administrator, or regular member) can invite others without requiring group owner/administrator approval, but invitee approval is needed.
  1. After sending the invitation, the successful callback returns RC_GROUP_NEED_INVITEE_ACCEPT (25427) in IRongCoreEnum.CoreErrorCode, indicating the invitee must approve before joining. Both the inviter and invitee receive the onGroupApplicationEvent callback.
  2. After the invitee approves, both the inviter and invitee receive the onGroupApplicationEvent callback. All group members receive the onGroupOperation callback with Join operation type.
Process D

Permission description:

  • When group owners/administrators invite others, group owner/administrator approval is required, but no invitee approval is needed.
  • Users with any role (group owner, administrator, or regular member) can invite others without requiring group owner/administrator approval or invitee approval.
  1. After sending the invitation, the successful callback returns SUCCESS (0) in IRongCoreEnum.CoreErrorCode, indicating the invitation succeeded. The invitee directly joins the group, and all members receive the onGroupOperation callback with Join operation type.

Handling Group Invitations

Accepting Group Invitations

After receiving a group invitation, users can call the acceptGroupInvite method to join the group.

Code Example

// Group ID
String groupId = "groupId1";
// Inviter's user ID
String inviterId = "userId1";
RongCoreClient.getInstance().acceptGroupInvite(groupId, inviterId, new IRongCoreCallback.OperationCallback() {
@Override
public void onSuccess() {
// Successfully accepted group invitation
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// Failed to accept group invitation
}
});

Rejecting Group Invitations

After receiving a group invitation, users can call the refuseGroupInvite method to decline joining the group.

Code Example

// Group ID
String groupId = "groupId1";
// Inviter's user ID
String inviterId = "userId1";
// Rejection reason
String reason = "Rejection reason";
RongCoreClient.getInstance().refuseGroupInvite(groupId, inviterId, reason, new IRongCoreCallback.OperationCallback() {
@Override
public void onSuccess() {
// Successfully rejected group invitation
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// Failed to reject group invitation
}
});

Group Owner/Administrator Handling Join Requests

Group applications expire after 7 days. RC servers store application data for up to 7 days—applicants must resubmit after expiration.

Approving Join Requests

After receiving a join request, group owners/administrators can call acceptGroupApplication to approve it.

  • For user-initiated join requests: Pass the applicant's ID as applicantId and set inviterId to null or empty string "".
  • For invitation-based join requests: Pass the applicant's ID as applicantId and the inviter's ID as inviterId.
  • Group applications expire after 7 days. RC servers store request data for up to 7 days—applicants must resubmit after expiration.

Code Example

// Group ID
String groupId = "groupId1";
// Inviter's user ID
String inviterId = "userId1";
// Applicant's user ID
String applicantId = "userId2";
RongCoreClient.getInstance().acceptGroupApplication(groupId, inviterId, applicantId, new IRongCoreCallback.ResultCallback<IRongCoreEnum.CoreErrorCode>() {
@Override
public void onSuccess(IRongCoreEnum.CoreErrorCode errorCode) {
// Successfully approved join request
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// Failed to approve join request
}
});

After successful API call, the callback's IRongCoreEnum.CoreErrorCode varies based on group invitee handling permissions ([inviteHandlePermission]):

  1. When invitee approval is required: Returns RC_GROUP_NEED_INVITEE_ACCEPT (25427), indicating pending invitee approval. The invitee receives the onGroupApplicationEvent callback.
  2. When no invitee approval is needed: Returns SUCCESS (0), indicating the invitee joined successfully. All members receive the onGroupOperation callback with Join type.

Rejecting Join Requests

After receiving a join request, group owners/administrators can call refuseGroupApplication to decline it.

  • For user-initiated join requests: Pass the applicant's ID as applicantId and set inviterId to null or empty string "".
  • For invitation-based join requests: Pass the applicant's ID as applicantId and the inviter's ID as inviterId.
  • Group applications expire after 7 days. RC servers store request data for up to 7 days—applicants must resubmit after expiration.

Code Example

// Group ID
String groupId = "groupId1";
// Inviter's user ID
String inviterId = "userId1";
// Applicant's user ID
String applicantId = "userId2";
// Rejection reason
String reason = "Rejection reason";
RongCoreClient.getInstance().refuseGroupApplication(groupId, inviterId, applicantId, reason, new IRongCoreCallback.OperationCallback() {
@Override
public void onSuccess() {
// Successfully rejected join request
}


@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// Failed to reject group join request
}
});

Paginate Group Application List

You can call the getGroupApplications method to paginate the group application list. Group applications expire after 7 days—RC servers store request data for up to 7 days. Applicants must resubmit after expiration.

This interface doesn't return the total request count.

Code Example

{
// ...
// Pagination parameter (null and "" have the same effect)
String pageToken = "";
getGroupApplications(pageToken);
// ...
}

public void getGroupApplications(String pageToken) {
// Pagination parameters
PagingQueryOption option = new PagingQueryOption();
// Set page size (1-100)
option.setCount(20);
// Pagination token
option.setPageToken(pageToken);
// Sort by operation time (true: ascending; false: descending)
option.setOrder(false);
// Query both sent and received applications
GroupApplicationDirection[] directions = new GroupApplicationDirection[]{GroupApplicationDirection.ApplicationSent, GroupApplicationDirection.ApplicationReceived};
// Query pending, rejected, and joined applications
GroupApplicationStatus[] status = new GroupApplicationStatus[]{GroupApplicationStatus.ManagerUnHandled, GroupApplicationStatus.ManagerRefused, GroupApplicationStatus.Joined};
RongCoreClient.getInstance().getGroupApplications(option, directions, status, new IRongCoreCallback.PageResultCallback<GroupApplicationInfo>() {
@Override
public void onSuccess(PagingQueryResult<GroupApplicationInfo> result) {
if (!TextUtils.isEmpty(result.getPageToken())) {
// Use the returned pageToken to fetch next page
getGroupApplications(result.getPageToken());
} else {
// Pagination complete
}
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// Failed to fetch data
}
});
}