Community features require ZIM SDK 3.0.0 or later.
Community is a premium feature. Please contact ZEGOCLOUD Technical Support for activation before use.
The Token generation method for Community features is the same as for other ZIM features, with no additional permission declarations required.
Invite Users to Join a Community
Call the inviteUsersIntoCommunity API to batch invite users to join a Community. The invitation does not require the other party's consent; invited users directly become Community members. Invited users must already be registered in the system.
A single API call can invite up to 100 users to join a Community.
Failed user information will be returned through errorUserList.
Example code
import im.zego.zim.ZIM;
import im.zego.zim.callback.ZIMCommunityUsersInvitedCallback;
import im.zego.zim.entity.ZIMError;
import im.zego.zim.entity.ZIMErrorUserInfo;
import im.zego.zim.enums.ZIMErrorCode;
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("user_1");
userIDs.add("user_2");
zim.inviteUsersIntoCommunity(userIDs, communityID, new ZIMCommunityUsersInvitedCallback() {
@Override
public void onCommunityUsersInvited(String communityID, ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Invitation complete; errorUserList lists users for whom the invitation failed
}
}
});
import im.zego.zim.ZIM;
import im.zego.zim.callback.ZIMCommunityUsersInvitedCallback;
import im.zego.zim.entity.ZIMError;
import im.zego.zim.entity.ZIMErrorUserInfo;
import im.zego.zim.enums.ZIMErrorCode;
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("user_1");
userIDs.add("user_2");
zim.inviteUsersIntoCommunity(userIDs, communityID, new ZIMCommunityUsersInvitedCallback() {
@Override
public void onCommunityUsersInvited(String communityID, ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Invitation complete; errorUserList lists users for whom the invitation failed
}
}
});
List<String> userIDs = ['user_1', 'user_2'];
try {
ZIMCommunityUsersInvitedResult result =
await ZIM.getInstance()!.inviteUsersIntoCommunity(userIDs, communityID);
// result.errorUserList lists users for whom the invitation failed
} on PlatformException catch (onError) {
// Operation failed
}
List<String> userIDs = ['user_1', 'user_2'];
try {
ZIMCommunityUsersInvitedResult result =
await ZIM.getInstance()!.inviteUsersIntoCommunity(userIDs, communityID);
// result.errorUserList lists users for whom the invitation failed
} on PlatformException catch (onError) {
// Operation failed
}
Common Error Codes
Error Code
Description
Recommended Action
6001004
Community does not exist
Confirm if the communityID is correct
6001005
User is not in the Community
Only occurs in specific scenarios; confirm user status
6001007
Community permission error
Confirm whether the current user has invitation permission
Remove Community Members
Call the kickCommunityMembers API to batch remove specified members from the Community.
A single API call can remove up to 100 users from the Community.
Warning
Only the Community owner and admins can call this API.
Example code
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("user_1");
userIDs.add("user_2");
zim.kickCommunityMembers(userIDs, communityID, new ZIMCommunityMembersKickedCallback() {
@Override
public void onCommunityMembersKicked(String communityID, ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Removal complete; errorUserList lists users for whom the operation failed
}
}
});
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("user_1");
userIDs.add("user_2");
zim.kickCommunityMembers(userIDs, communityID, new ZIMCommunityMembersKickedCallback() {
@Override
public void onCommunityMembersKicked(String communityID, ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Removal complete; errorUserList lists users for whom the operation failed
}
}
});
Call the transferCommunityOwner API to transfer the ownership of the current Community to another member within the Community. After the transfer, the original owner will become a regular member.
Warning
Only the Community owner can call this API.
Example code
zim.transferCommunityOwner("new_owner_user_id", communityID,
new ZIMCommunityOwnerTransferredCallback() {
@Override
public void onCommunityOwnerTransferred(String communityID, String toUserID, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Transferred successfully
}
}
});
zim.transferCommunityOwner("new_owner_user_id", communityID,
new ZIMCommunityOwnerTransferredCallback() {
@Override
public void onCommunityOwnerTransferred(String communityID, String toUserID, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Transferred successfully
}
}
});
try {
await ZIM.getInstance()!
.transferCommunityOwner('new_owner_user_id', communityID);
// Transferred successfully
} on PlatformException catch (onError) {
// Transfer failed
}
try {
await ZIM.getInstance()!
.transferCommunityOwner('new_owner_user_id', communityID);
// Transferred successfully
} on PlatformException catch (onError) {
// Transfer failed
}
Query Community Member List
Call the queryCommunityMemberList API to retrieve the member list of a specified Community in pages.
Pagination rules are the same as querying the Community list: for the first query, set config.nextFlag to 0, then pass the returned nextFlag to the next request until nextFlag returns 0.
Example code
ZIMCommunityMemberListQueryConfig config = new ZIMCommunityMemberListQueryConfig();
config.setNextFlag(0); // Set to 0 for the first query
zim.queryCommunityMemberList(communityID, 100, config, new ZIMCommunityMemberListQueriedCallback() {
@Override
public void onCommunityMemberListQueried(String communityID, ArrayList<ZIMCommunityMemberInfo> memberList, long nextFlag, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// memberList is the member list for the current page
}
}
});
ZIMCommunityMemberListQueryConfig config = new ZIMCommunityMemberListQueryConfig();
config.setNextFlag(0); // Set to 0 for the first query
zim.queryCommunityMemberList(communityID, 100, config, new ZIMCommunityMemberListQueriedCallback() {
@Override
public void onCommunityMemberListQueried(String communityID, ArrayList<ZIMCommunityMemberInfo> memberList, long nextFlag, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// memberList is the member list for the current page
}
}
});
const userIDs = ['user_1', 'user_2'];
zim.queryCommunityMembers(userIDs, communityID)
.then((result: ZIMCommunityMembersQueriedResult) => {
// result.memberList contains the queried member information
})
.catch((err: ZIMError) => {
// Query failed
});
const userIDs = ['user_1', 'user_2'];
zim.queryCommunityMembers(userIDs, communityID)
.then((result: ZIMCommunityMembersQueriedResult) => {
// result.memberList contains the queried member information
})
.catch((err: ZIMError) => {
// Query failed
});
Example code
List<String> userIDs = ['user_1', 'user_2'];
try {
ZIMCommunityMembersQueriedResult result =
await ZIM.getInstance()!.queryCommunityMembers(userIDs, communityID);
// result.memberList is the member information
} on PlatformException catch (onError) {
// Query failed
}
List<String> userIDs = ['user_1', 'user_2'];
try {
ZIMCommunityMembersQueriedResult result =
await ZIM.getInstance()!.queryCommunityMembers(userIDs, communityID);
// result.memberList is the member information
} on PlatformException catch (onError) {
// Query failed
}
Mute Members
Call the muteCommunityMembers API to batch set the mute status of specified members in specified Channels within the Community. Mute configuration is passed through ZIMCommunityMemberMuteConfig.
Configuration Field
Description
channelID
Specifies the Channel ID where the mute takes effect. Leave blank to apply to all Channels.
duration
Mute duration (seconds), range 1-2592001 (approximately 30 days), or -1 for permanent mute.
Warning
Only the Community owner and admins can call this API.
Example code
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("user_1");
userIDs.add("user_2");
ZIMCommunityMemberMuteConfig config = new ZIMCommunityMemberMuteConfig();
config.setDuration(3600); // Mute for 1 hour; -1 for permanent mute
config.setChannelID("channel_001"); // Specify a Channel; leave blank to apply to all Channels
// isMute = true to mute, false to unmute
zim.muteCommunityMembers(true, userIDs, communityID, config,
new ZIMCommunityMembersMutedCallback() {
@Override
public void onCommunityMembersMuted(String communityID, String channelID, boolean isMute, ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Mute set successfully
}
}
});
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("user_1");
userIDs.add("user_2");
ZIMCommunityMemberMuteConfig config = new ZIMCommunityMemberMuteConfig();
config.setDuration(3600); // Mute for 1 hour; -1 for permanent mute
config.setChannelID("channel_001"); // Specify a Channel; leave blank to apply to all Channels
// isMute = true to mute, false to unmute
zim.muteCommunityMembers(true, userIDs, communityID, config,
new ZIMCommunityMembersMutedCallback() {
@Override
public void onCommunityMembersMuted(String communityID, String channelID, boolean isMute, ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
if (errorInfo.code == ZIMErrorCode.SUCCESS) {
// Mute set successfully
}
}
});
When members join or leave a Community, the SDK will trigger the communityMemberStateChanged callback. Use updateInfo.getState() to determine whether a member has entered (ENTERED) or exited (EXITED).
Example code
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onCommunityMemberStateChanged(ZIM zim, ZIMCommunityMemberStateChangedEventResult result) {
for (ZIMCommunityMemberStateChangeInfo updateInfo : result.getUpdateInfoList()) {
if (updateInfo.getState() == ZIMCommunityMemberChangeState.ENTERED) {
// Member joined the Community
} else if (updateInfo.getState() == ZIMCommunityMemberChangeState.EXITED) {
// Member left the Community
}
}
}
});
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onCommunityMemberStateChanged(ZIM zim, ZIMCommunityMemberStateChangedEventResult result) {
for (ZIMCommunityMemberStateChangeInfo updateInfo : result.getUpdateInfoList()) {
if (updateInfo.getState() == ZIMCommunityMemberChangeState.ENTERED) {
// Member joined the Community
} else if (updateInfo.getState() == ZIMCommunityMemberChangeState.EXITED) {
// Member left the Community
}
}
}
});
Example code
- (void)zim:(ZIM *)zim communityMemberStateChangedWithResult:(ZIMCommunityMemberStateChangedEventResult *)result {
for (ZIMCommunityMemberStateChangeInfo *updateInfo in result.updateInfoList) {
if (updateInfo.state == ZIMCommunityMemberChangeStateEntered) {
// Member joined the Community
} else if (updateInfo.state == ZIMCommunityMemberChangeStateExited) {
// Member left the Community
}
}
}
- (void)zim:(ZIM *)zim communityMemberStateChangedWithResult:(ZIMCommunityMemberStateChangedEventResult *)result {
for (ZIMCommunityMemberStateChangeInfo *updateInfo in result.updateInfoList) {
if (updateInfo.state == ZIMCommunityMemberChangeStateEntered) {
// Member joined the Community
} else if (updateInfo.state == ZIMCommunityMemberChangeStateExited) {
// Member left the Community
}
}
}
Example code
void onCommunityMemberStateChanged(zim::ZIM *zim,
const zim::ZIMCommunityMemberStateChangedEventResult &result) override {
for (const auto &updateInfo : result.updateInfoList) {
if (updateInfo.state == zim::ZIM_COMMUNITY_MEMBER_CHANGE_STATE_ENTERED) {
// Member joined the Community
} else if (updateInfo.state == zim::ZIM_COMMUNITY_MEMBER_CHANGE_STATE_EXITED) {
// Member left the Community
}
}
}
void onCommunityMemberStateChanged(zim::ZIM *zim,
const zim::ZIMCommunityMemberStateChangedEventResult &result) override {
for (const auto &updateInfo : result.updateInfoList) {
if (updateInfo.state == zim::ZIM_COMMUNITY_MEMBER_CHANGE_STATE_ENTERED) {
// Member joined the Community
} else if (updateInfo.state == zim::ZIM_COMMUNITY_MEMBER_CHANGE_STATE_EXITED) {
// Member left the Community
}
}
}
Example code
zim.on('communityMemberStateChanged', (zim, result) => {
for (const updateInfo of result.updateInfoList) {
if (updateInfo.state === ZIMCommunityMemberChangeState.Entered) {
// Member joined the Community
} else if (updateInfo.state === ZIMCommunityMemberChangeState.Exited) {
// Member left the Community
}
}
});
zim.on('communityMemberStateChanged', (zim, result) => {
for (const updateInfo of result.updateInfoList) {
if (updateInfo.state === ZIMCommunityMemberChangeState.Entered) {
// Member joined the Community
} else if (updateInfo.state === ZIMCommunityMemberChangeState.Exited) {
// Member left the Community
}
}
});
Example code
ZIMEventHandler.onCommunityMemberStateChanged =
(ZIM zim, ZIMCommunityMemberStateChangedEventResult result) {
for (final updateInfo in result.updateInfoList) {
if (updateInfo.state == ZIMCommunityMemberChangeState.Entered) {
// Member joined the Community
} else if (updateInfo.state == ZIMCommunityMemberChangeState.Exited) {
// Member left the Community
}
}
};
ZIMEventHandler.onCommunityMemberStateChanged =
(ZIM zim, ZIMCommunityMemberStateChangedEventResult result) {
for (final updateInfo in result.updateInfoList) {
if (updateInfo.state == ZIMCommunityMemberChangeState.Entered) {
// Member joined the Community
} else if (updateInfo.state == ZIMCommunityMemberChangeState.Exited) {
// Member left the Community
}
}
};
Member Information Updates
When a Community member's nickname, role, mute status, or other information changes, the SDK will trigger the communityMemberInfoUpdated callback.
Example code
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onCommunityMemberInfoUpdated(ZIM zim, ZIMCommunityMemberInfoUpdatedEventResult result) {
for (ZIMCommunityMemberInfoUpdateInfo updateInfo : result.getUpdateInfoList()) {
ZIMCommunityMemberInfo memberInfo = updateInfo.getMemberInfo();
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
// memberInfo.enterInfo: member join information
}
}
});
zim.setEventHandler(new ZIMEventHandler() {
@Override
public void onCommunityMemberInfoUpdated(ZIM zim, ZIMCommunityMemberInfoUpdatedEventResult result) {
for (ZIMCommunityMemberInfoUpdateInfo updateInfo : result.getUpdateInfoList()) {
ZIMCommunityMemberInfo memberInfo = updateInfo.getMemberInfo();
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
// memberInfo.enterInfo: member join information
}
}
});
Example code
- (void)zim:(ZIM *)zim communityMemberInfoUpdatedWithResult:(ZIMCommunityMemberInfoUpdatedEventResult *)result {
for (ZIMCommunityMemberInfoUpdateInfo *updateInfo in result.updateInfoList) {
ZIMCommunityMemberInfo *memberInfo = updateInfo.memberInfo;
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
// memberInfo.enterInfo: member join information
}
}
- (void)zim:(ZIM *)zim communityMemberInfoUpdatedWithResult:(ZIMCommunityMemberInfoUpdatedEventResult *)result {
for (ZIMCommunityMemberInfoUpdateInfo *updateInfo in result.updateInfoList) {
ZIMCommunityMemberInfo *memberInfo = updateInfo.memberInfo;
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
// memberInfo.enterInfo: member join information
}
}
Example code
void onCommunityMemberInfoUpdated(zim::ZIM *zim,
const zim::ZIMCommunityMemberInfoUpdatedEventResult &result) override {
for (const auto &updateInfo : result.updateInfoList) {
// updateInfo.memberInfo contains the updated member information
}
}
void onCommunityMemberInfoUpdated(zim::ZIM *zim,
const zim::ZIMCommunityMemberInfoUpdatedEventResult &result) override {
for (const auto &updateInfo : result.updateInfoList) {
// updateInfo.memberInfo contains the updated member information
}
}
Example code
zim.on('communityMemberInfoUpdated', (zim, result) => {
for (const updateInfo of result.updateInfoList) {
const memberInfo = updateInfo.memberInfo;
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
}
});
zim.on('communityMemberInfoUpdated', (zim, result) => {
for (const updateInfo of result.updateInfoList) {
const memberInfo = updateInfo.memberInfo;
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
}
});
Example code
ZIMEventHandler.onCommunityMemberInfoUpdated =
(ZIM zim, ZIMCommunityMemberInfoUpdatedEventResult result) {
for (final updateInfo in result.updateInfoList) {
final memberInfo = updateInfo.memberInfo;
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
}
};
ZIMEventHandler.onCommunityMemberInfoUpdated =
(ZIM zim, ZIMCommunityMemberInfoUpdatedEventResult result) {
for (final updateInfo in result.updateInfoList) {
final memberInfo = updateInfo.memberInfo;
// memberInfo.memberRole: member role
// memberInfo.muteInfo: mute information
}
};