环信超级社区 (Circle)Android 快速开始
更新时间:2022-08-18
集成准备
使用 Circle 之前,确保你已经集成环信即时通讯 IM Android SDK 3.9.7,详见 环信即时通讯 IM Android 快速开始。
技术原理
用户需加入一个社区,选择加入社区中的频道,然后才能在频道中发送消息。
发送和接收消息的逻辑如下:
- 发送方获取社区 ID;
- 发送方获取频道 ID;
- 发送方通过
sendMessage
发送消息; - 接收方通过
EMMessageListener
注册监听器接收各类消息的回调。
实现方法
获取 CircleManager
EMCircleManager circleManager = EMClient.getInstance().chatCircleManager();
获取指定的社区
你可以通过三种方式获取指定的社区 ID:
- 创建社区;
- 加入一个现有社区;
- 获取已加入的社区列表。
创建社区
你可以调用 EMCircleServerAttribute()
方法创建一个社区:
EMCircleServerAttribute serverAttribute=new EMCircleServerAttribute();
serverAttribute.setName("server name");
serverAttribute.setIcon(testImg);
serverAttribute.setDesc("desc");
serverAttribute.setExt("");
circleManager.createServer(serverAttribute, new EMValueCallBack<EMCircleServer>() {
@Override
public void onSuccess(EMCircleServer value) {
serverId = value.getServerId();
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "回调 onSuccess,serverId=" + value.getServerId());
}
});
}
@Override
public void onError(int error, String errorMsg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "回调 onError,error=" + error + ",errorMsg="+errorMsg);
}
});
}
});
加入一个现有社区
你可以调用 joinServer
方法加入一个现有的社区:
circleManager.joinServer(serverId, new EMValueCallBack<EMCircleServer>() {
@Override
public void onSuccess(EMCircleServer circleServer) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG, " 回调 joinToServer->onSuccess,serverId=" + circleServer.getServerId());
}
});
}
@Override
public void onError(int error, String errorMsg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG, "回调onError,error=" + error + ",errorMsg=" + errorMsg);
}
});
}
});
获取已加入的社区列表
你可以调用 fetchJoinedServers
方法获取已加入的社区列表:
circleManager.fetchJoinedServers( 10, null, new EMValueCallBack<EMCursorResult<EMCircleServer>>() {
@Override
public void onSuccess(EMCursorResult<EMCircleServer> value) {
List<EMCircleServer> datas = value.getData();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < datas.size(); i++) {
String serverId = datas.get(i).getServerId();
builder.append("\nserverid=" + serverId);
}
Log.e(TAG, "回调 queryJoinedServers()->onSuccess " + ",serverIds=" + builder.toString());
}
@Override
public void onError(int error, String errorMsg) {
Log.e(TAG, "回调 onError,error=" + error + ",errorMsg=" + errorMsg);
}
});
获取指定的频道
你可以通过三种方式获取指定的频道 ID:
- 创建频道;
- 加入一个现有频道;
- 获取已加入的频道列表。
创建频道
你可以调用 createChannel
方法创建频道:
EMCircleChannelAttribute channelAttribute1=new EMCircleChannelAttribute();
channelAttribute1.setName("channel-name");
channelAttribute1.setDesc("channel-desc");
channelAttribute1.setExt("custom");
circleManager.createChannel(serverId, channelAttribute1, EMCircleChannelStyle.EMChannelStylePublic, new EMValueCallBack<EMCircleChannel>() {
@Override
public void onSuccess(EMCircleChannel value) {
Log.e(TAG, "回调 createChannel()->onSuccess " + ",channelId=" + value.getChannelId() + ",name=" + value.getName() + ",custom=" + value.getExt());
}
@Override
public void onError(int code, String errorMsg) {
Log.e(TAG, "回调 createChannel()->onError,code=" + code + ",errorMsg=" + errorMsg);
}
});
加入一个现有频道
你可以调用 joinToChannel
方法加入频道:
circleManager.joinToChannel(serverId, mChannelId, new EMValueCallBack<EMCircleChannel>() {
@Override
public void onSuccess(EMCircleChannel circleChannel) {
Log.e(TAG, "回调 joinToChannel()-> onSuccess,circleChannel="+circleChannel.getChannelId());
}
@Override
public void onError(int code, String error) {
Log.e(TAG, "回调 joinToChannel()->onError,code=" + code + ",errorMsg=" + error);
}
});
获取已加入的公开频道列表
你可以调用 fetchPublicChannels
方法获取已加入的公开频道列表:
circleManager.fetchPublicChannels(serverId, 10, null, new EMValueCallBack<EMCursorResult<EMCircleChannel>>() {
@Override
public void onSuccess(EMCursorResult<EMCircleChannel> value) {
List<EMCircleChannel> datas = value.getData();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < datas.size(); i++) {
String channelId = datas.get(i).getChannelId();
builder.append("\nchannelid=" + channelId);
}
Log.e(TAG, "回调 queryPublicChannelsInServer()->onSuccess " + ",channelIds=" + builder.toString());
}
@Override
public void onError(int error, String errorMsg) {
Log.e(TAG, "回调 queryPublicChannelsInServer()->onError,code=" + error + ",errorMsg=" + errorMsg);
}
});
获取社区中当前用户可见的私有频道列表
社区中的普通成员只能获取到自己加入的私有频道,而社区所有者和管理员可以获取全部的私有频道。
int limit=10;
circleManager.fetchVisiblePrivateChannels(serverId, limit, null, new EMValueCallBack<EMCursorResult<EMCircleChannel>>() {
@Override
public void onSuccess(EMCursorResult<EMCircleChannel> value) {
List<EMCircleChannel> datas = value.getData();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < datas.size(); i++) {
String channelId = datas.get(i).getChannelId();
builder.append("\nchannelid=" + channelId);
}
Log.e(TAG, "回调 queryVisiblePrivateChannelsInServer()->onSuccess " + ",channelIds=" + builder.toString());
}
@Override
public void onError(int error, String errorMsg) {
Log.e(TAG, "回调 queryVisiblePrivateChannelsInServer()->onError,code=" + error + ",errorMsg=" + errorMsg);
}
});
发送和接收一条频道消息
在频道中发送和接收消息,你可以参考 发送和接收消息。
发送一条频道消息
你可以调用 createTxtSendMessage
方法在指定频道中发送一条文本消息:
// 创建一条文本消息,`content` 为消息文字内容,`channelID` 为频道 ID
EMMessage message = EMMessage.createTxtSendMessage(content, channelID);
// 设置消息类型,即设置 `Message` 类的 `ChatType` 为`GroupChat`。
message.setChatType(ChatType.GroupChat);
// 设置消息属性为 `Channel Message`。
message.setIsChannelMessage(true);
// 发送消息。
EMClient.getInstance().chatManager().sendMessage(message);
// 发送消息时可以设置 `EMCallBack` 的实例,获得消息发送的状态。可以在该回调中更新消息的显示状态。例如消息发送失败后的提示等等。
message.setMessageStatusCallback(new EMCallBack() {
@Override
public void onSuccess() {
showToast("发送消息成功");
dialog.dismiss();
}
@Override
public void onError(int code, String error) {
showToast("发送消息失败");
}
@Override
public void onProgress(int progress, String status) {
}
});
EMClient.getInstance().chatManager().sendMessage(message);
接收一条频道消息
你可以注册 EMMessageListener
监听器接收消息。
EMMessageListener msgListener = new EMMessageListener() {
// 收到消息,遍历消息队列,解析和显示。
@Override
public void onMessageReceived(List<EMMessage> messages) {
}
};
EMClient.getInstance().chatManager().addMessageListener(msgListener);