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
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:
- When join permission is Requires group owner/administrator approval, successful API call returns
RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT
(25424) inIRongCoreEnum.CoreErrorCode
, indicating pending approval. Both the requester and group owner/administrator receiveonGroupApplicationEvent
callback. - When join permission is No approval needed, successful API call returns
SUCCESS
(0) inIRongCoreEnum.CoreErrorCode
, indicating successful join. Both the requester and all group members receiveonGroupOperation
callback withJoin
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:
- Join permission ([joinPermission]): Whether group owner/administrator approval is required
- Inviter role ([role]): Whether inviter is group owner/administrator or regular member
- Invitee handling permission ([inviteHandlePermission]): Whether invitee consent is required
Specific Rules
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 Permission | Inviter Role | Invitee Approval | Event Flow |
---|---|---|---|
Requires owner/admin approval | Regular member | Required | Flow A |
Not required | Flow B | ||
Owner or admin | Required | Flow C | |
Not required | Flow D | ||
No approval needed | All roles | Required | Flow C |
Not required | Flow D |
Event Flows
Flow B
Permission scenario:
- Regular member invites others
- Requires owner/administrator approval
- Doesn't require invitee approval
-
After sending invitation, successful callback returns
RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT
(25424) inIRongCoreEnum.CoreErrorCode
, indicating pending approval. Both inviter and owner/administrator receiveonGroupApplicationEvent
callback. -
After owner/administrator approves, invitee joins group successfully. Inviter and owner/administrator receive
onGroupApplicationEvent
callback. All group members receiveonGroupOperation
callback withJoin
operation type. -
After sending the invitation, the successful callback returns
RC_GROUP_JOIN_GROUP_NEED_MANAGER_ACCEPT
(25424) inIRongCoreEnum.CoreErrorCode
, indicating pending approval from the group owner/administrator. Both the inviter and group owner/administrator receive theonGroupApplicationEvent
callback. -
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 theonGroupOperation
callback withJoin
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.
- After sending the invitation, the successful callback returns
RC_GROUP_NEED_INVITEE_ACCEPT
(25427) inIRongCoreEnum.CoreErrorCode
, indicating the invitee must approve before joining. Both the inviter and invitee receive theonGroupApplicationEvent
callback. - After the invitee approves, both the inviter and invitee receive the
onGroupApplicationEvent
callback. All group members receive theonGroupOperation
callback withJoin
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.
- After sending the invitation, the successful callback returns
SUCCESS
(0) inIRongCoreEnum.CoreErrorCode
, indicating the invitation succeeded. The invitee directly joins the group, and all members receive theonGroupOperation
callback withJoin
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 setinviterId
tonull
or empty string""
. - For invitation-based join requests: Pass the applicant's ID as
applicantId
and the inviter's ID asinviterId
. - 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]):
- When invitee approval is required: Returns
RC_GROUP_NEED_INVITEE_ACCEPT
(25427), indicating pending invitee approval. The invitee receives theonGroupApplicationEvent
callback. - When no invitee approval is needed: Returns
SUCCESS
(0), indicating the invitee joined successfully. All members receive theonGroupOperation
callback withJoin
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 setinviterId
tonull
or empty string""
. - For invitation-based join requests: Pass the applicant's ID as
applicantId
and the inviter's ID asinviterId
. - 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
}
});
}