====== 聊天室 ====== ---- 环信聊天室模型支持最大成员数为5000,和群组不同,聊天室内成员离线后,服务器当监听到此成员不在线后不在会给此成员再发推送。 * 支持最大成员5000; * 环信的聊天室内仅有 owner 和游客; * 不支持客户端建立聊天室; * 不支持客户端邀请; * 不支持 REST 邀请。 ===== 服务器端 ===== ==== 创建聊天室 ==== curl -X POST “http://a1.easemob.com/easemob-demo/chatdemoui/chatrooms” -H “Authorization: Bearer ${token}” -d ‘{“owner”:”u1”,”members”:[“u1”,”u2”],”maxusers”:5000,”groupname”:”chatroom title”,”desc”:”chatroom description”}” ==== 查询所有 APP 聊天室 ==== curl -X GET “http://a1.easemob.com/easemob-demo/chatdemoui/chatrooms” -H “Authorization: Bearer ${token}” ==== 查询聊天室详情 ==== curl -X GET “http://a1.easemob.com/easemob-demo/chatdemoui/chatrooms/1430798028680235” -H “Authorization: Bearer ${token}” ==== 聊天室踢人 ==== curl -X DELETE ‘https://a1.easemob.com/easemob-demo/chatdemoui/chatrooms/1430798028680235/users/u2’ -H “Authorization: Bearer ${token}” ==== 删除聊天室 ==== curl -X DELETE ‘https://a1.easemob.com/easemob-demo/chatdemoui/chatrooms/143228117786605’ -H “Authorization: Bearer ${token}” 更多REST操作请参考 [[start:100serverintegration:70chatroommgmt|聊天室管理]]。 ===== 客户端 ===== * 支持查询所有 APP 聊天室; * 支持查询聊天室详情; * 加入聊天室; * 退出聊天室; * 客户端的 API 都是通过 EMChatManager 获取。 ==== 加入聊天室 ==== public void joinChatRoom(final String roomId, final EMValueCallBack callback) 参数: * roomId: 聊天室 ID,一般都会从自己 APP 的后台获取。 * callback: EMValueCallBack 加入成功返回聊天室简要信息,加入失败返回 error。 示例: public void onChatroomViewCreation{ findViewById(R.id.container_to_group).setVisibility(View.GONE); final ProgressDialog pd = ProgressDialog.show(this, "", "Joining......"); EMChatManager.getInstance().joinChatRoom(toChatUsername, new EMValueCallBack() { @Override public void onSuccess(EMChatRoom value) { runOnUiThread(new Runnable(){ @Override public void run(){ pd.dismiss(); room = EMChatManager.getInstance().getChatRoom(toChatUsername); if(room !=null){ ((TextView) findViewById(R.id.name)).setText(room.getName()); }else{ ((TextView) findViewById(R.id.name)).setText(toChatUsername); } EMLog.d(TAG, "join room success : " + room.getName()); onConversationInit(); onListViewCreation(); } }); } @Override public void onError(final int error, String errorMsg) { EMLog.d(TAG, "join room failure : " + error); runOnUiThread(new Runnable(){ @Override public void run(){ pd.dismiss(); } }); finish(); } }); } protected void onConversationInit(){ if(chatType == CHATTYPE_SINGLE){ conversation = EMChatManager.getInstance().getConversationByType(toChatUsername,EMConversationType.Chat); }else if(chatType == CHATTYPE_GROUP){ conversation = EMChatManager.getInstance().getConversationByType(toChatUsername,EMConversationType.GroupChat); }else if(chatType == CHATTYPE_CHATROOM){ conversation = EMChatManager.getInstance().getConversationByType(toChatUsername,EMConversationType.ChatRoom); } // 把此会话的未读数置为0 conversation.markAllMessagesAsRead(); // 初始化db时,每个conversation加载数目是getChatOptions().getNumberOfMessagesLoaded // 这个数目如果比用户期望进入会话界面时显示的个数不一样,就多加载一些 final List msgs = conversation.getAllMessages(); int msgCount = msgs != null ? msgs.size() : 0; if (msgCount < conversation.getAllMsgCount() && msgCount < pagesize) { String msgId = null; if (msgs != null && msgs.size() > 0) { msgId = msgs.get(0).getMsgId(); } if (chatType == CHATTYPE_SINGLE) { conversation.loadMoreMsgFromDB(msgId, pagesize); } else { conversation.loadMoreGroupMsgFromDB(msgId, pagesize); } } // 监听聊天室变化回调 EMChatManager.getInstance().addChatRoomChangeListener(new EMChatRoomChangeListener(){ @Override public void onInvitationReceived(String roomId, String roomName, String inviter, String reason) { } @Override public void onChatRoomDestroyed(String roomId, String roomName) { if(roomId.equals(toChatUsername)){ finish(); } } @Override public void onMemberJoined(String roomId, String participant) { } @Override public void onMemberExited(String roomId, String roomName, String participant) { } @Override public void onMemberKicked(String roomId, String roomName, String participant) { if(roomId.equals(toChatUsername)){ String curUser = EMChatManager.getInstance().getCurrentUser(); if(curUser.equals(participant)){ EMChatManager.getInstance().leaveChatRoom(toChatUsername); finish(); } } } }); } 请注意对于聊天室模型,请一定要等到 Join 回调成功后再去初始化 conversation。 ==== 离开聊天室 ==== public void leaveChatRoom(String roomId) 参数: roomId: 要退出的聊天室的ID。 此方法是异步方法,不会阻塞当前线程。此方法没有回调,原因是在任何场景下退出聊天室,SDK 保证退出成功,无论有网出错,还是无网退出。对于聊天室模型,一般退出会话页面,就会调用此 leave 方法。 public EMCursorResult fetchPublicChatRoomsFromServer(int pageSize, String cursor) throws EaseMobException 参数: * pageSize: 此次获取的条目。 * cursor: 后台需要的 cursor id,根据此 Id 再次获取 pageSize 的条目,首次传 null 即可。 返回值: EMCursorResult 内部包含返回的 cursor,和 List。 ==== 获取所有聊天室信息 ==== 获取所有环信的聊天室信息,包括聊天室 ID 和名称。 public EMChatRoom fetchChatRoomFromServer(String roomId) throws EaseMobException ==== 获取聊天室详情 ==== === 聊天室回调监听 === public interface EMChatRoomChangeListener { /** * 聊天室被解散。 * * @param roomId * 聊天室id * @param roomName * 聊天室名称 */ void onChatRoomDestroyed(String roomId, String roomName); /** * 聊天室加入新成员事件 * * @param roomId * 聊天室id * @param participant * 新成员username */ void onMemberJoined(String roomId, String participant); /** * 聊天室成员主动退出事件 * * @param roomId * 聊天室id * @param roomName * 聊天室名字 * @param participant * 退出的成员的username */ void onMemberExited(String roomId, String roomName, String participant); /** * 聊天室人员被移除 * * @param roomId * 聊天室id *@param roomName * 聊天室名字 * @param participant * 被移除人员的username */ void onMemberKicked(String roomId, String roomName, String participant); } 应用可以通过注册聊天室监听,进行对UI的刷新。 public void addChatRoomChangeListener(EMChatRoomChangeListener listener) === 注册聊天室监听 === 在会话页面注册监听,来监听成员被踢和聊天室被删除。 EMChatManager.getInstance().addChatRoomChangeListener(new EMChatRoomChangeListener(){ @Override public void onChatRoomDestroyed(String roomId, String roomName) { if(roomId.equals(toChatUsername)){ finish(); } } @Override public void onMemberJoined(String roomId, String participant) { } @Override public void onMemberExited(String roomId, String roomName, String participant) { } @Override public void onMemberKicked(String roomId, String roomName, String participant) { if(roomId.equals(toChatUsername)){ finish(); } } }); === 移除聊天室监听 === public void removeChatRoomChangeListener(EMChatRoomChangeListener listener) ---- 上一页:[[start:200androidcleintintegration:70groupchat|群组管理]] 下一页:[[start:200androidcleintintegration:90realtimeaudio|实时通话]]