聊天室管理

概述

jmessage android sdk 从2.4.0版本开始提供聊天室功能,包括查询基本信息,加入聊天室,退出聊天室等。

聊天室和群组的主要区别在于:

  • 聊天室的消息没有推送通知和离线保存,也没有常驻成员的概念,只要进入聊天室即可接收消息,开始聊天。一旦退出聊天室,不再会接收到任何消息、通知和提醒。

  • 本地获取聊天室会话对象需要通过单独的接口 JMessageClient.getChatRoomConversationList或者 JMessageClient.getChatRoomConversation获取。JMessageClient.getConversationList接口不会返回聊天室的会话对象。

  • 在线收到聊天室消息时,sdk仅仅只会将消息通过ChatRoomMessageEvent事件上抛,不会将消息落地。上层通过聊天室会话对象获取message时,sdk将返回空。

注意:进入聊天室会自动获取最近50条消息,通过ChatRoomMessageEvent事件上抛给应用层。客户端目前不支持创建聊天室

聊天室对象

Since 2.4.0聊天室信息对象ChatRoomInfo

方法类型说明
getRoomID()long获取聊天室id
getName()String获取聊天室名称
getAppKey()String获取聊天室所属AppKey
getOwnerInfo()UserInfo获取聊天室拥有者UserInfo
getMaxMemberCount()int获取聊天室允许的最大成员数量
getDescription()String获取聊天室描述
getTotalMemberCount()int获取聊天室当前成员数量
getCreateTime()int获取聊天室创建时间 单位-秒

获取应用下聊天室列表

Since 2.4.0

  1. /**
  2. * 获取当前应用appkey所属下聊天室信息列表。
  3. *
  4. * @param start 起始位置
  5. * @param count 获取个数
  6. * @param callback 接口回调
  7. * @since 2.4.0
  8. */
  9. ChatRoomManager.getChatRoomListByApp(int start, int count, RequestCallback<List<ChatRoomInfo>> callback);

获取当前用户加入的聊天室列表

Since 2.4.0

  1. /**
  2. * 获取当前用户所加入的所有聊天室的信息列表。
  3. *
  4. * @param callback 接口回调
  5. * @since 2.4.0
  6. */
  7. ChatRoomManager.getChatRoomListByUser(RequestCallback<List<ChatRoomInfo>> callback);

查询指定roomID的聊天室信息

Since 2.4.0

  1. /**
  2. * 查询指定roomID的聊天室信息。
  3. *
  4. * @param roomIDs 待查询的roomID集合
  5. * @param callback 接口回调
  6. * @since 2.4.0
  7. */
  8. ChatRoomManager.getChatRoomInfos(Set<Long> roomIDs, final RequestCallback<List<ChatRoomInfo>> callback);

进入聊天室

Since 2.4.0

  1. /**
  2. * 进入聊天室.
  3. * 用户只有成功调用此接口之后,才能收到聊天室消息,以及在此聊天室中发言。
  4. * 成功进入聊天室之后,会将聊天室中最近若干条聊天记录同步到本地并以{@link cn.jpush.im.android.api.event.ChatRoomMessageEvent}事件的形式通知到上层。
  5. *
  6. * @param roomID 聊天室的roomID
  7. * @param callback 接口回调
  8. * @since 2.4.0
  9. */
  10. ChatRoomManager.enterChatRoom(long roomID, final RequestCallback<Conversation> callback);

离开聊天室

Since 2.4.0

  1. /**
  2. * 离开聊天室.
  3. * 成功调用此接口之后,用户将能不在此聊天室收发消息。
  4. *
  5. * @param roomID 聊天室的roomID
  6. * @param callback 接口回调
  7. * @since 2.4.0
  8. */
  9. ChatRoomManager.leaveChatRoom(long roomID, final BasicCallback callback);

获取聊天室会话

Since 2.4.0

  1. /**
  2. * 获取聊天室会话信息
  3. *
  4. * @param roomID 群组的groupID
  5. * @return 返回会话信息,若不存在和指定对象的会话则返回null
  6. * @since 2.4.0
  7. */
  8. JMessageClient.getChatRoomConversation(long roomID);
  9. /**
  10. * 从本地数据库中获取包含所有的聊天室会话的列表
  11. *
  12. * @return 返回当前用户的聊天室会话列表,没有则返回空的列表
  13. * @since 2.4.0
  14. */
  15. JMessageClient.getChatRoomConversationList();

创建聊天室会话

Since 2.4.0

  1. /**
  2. * 创建聊天室会话,如果本地已存在对应会话,则不会重新创建,直接返回本地会话对象。
  3. *
  4. * @param roomID 聊天室的roomID
  5. * @return 会话对象
  6. * @since 2.4.0
  7. */
  8. Conversation.createChatRoomConversation(long roomID);

删除聊天室会话

Since 2.4.0

  1. /**
  2. * 删除聊天室会话,同时删除掉本地相关缓存文件
  3. *
  4. * @param roomID 聊天室roomID
  5. * @return 删除成功返回true, 否则返回false
  6. * @since 2.4.0
  7. */
  8. JMessageClient.deleteChatRoomConversation(long roomID);

聊天室消息

Since 2.4.0

  1. ChatRoomMessageEvent

用户进入聊天室之后,收到聊天室消息时,sdk会主动上抛此事件通知上层,具体处理方法见事件处理一节。

聊天室管理员

Since 2.8.0

设置聊天室管理员

Since 2.8.0

  1. /**
  2. * 将指定用户设置为聊天室的房管,只有房主有此权限,房管可设置聊天室的黑名单
  3. *
  4. * @param roomID 聊天室的roomID
  5. * @param userInfos 准备设置为房管的用户UserInfo列表
  6. * @param callback 回调
  7. * @since 2.8.0
  8. */
  9. ChatRoomManager.addChatRoomAdmin(long roomID, List<UserInfo> userInfos, BasicCallback callback);

取消聊天室管理员

Since 2.8.0

  1. /**
  2. * 取消指定用户的聊天室房管身份,只有房主有此权限
  3. *
  4. * @param roomID 聊天室的roomID
  5. * @param userInfos 准备取消房管的用户UserInfo列表
  6. * @param callback 回调
  7. * @since 2.8.0
  8. */
  9. ChatRoomManager.delChatRoomAdmin(long roomID, List<UserInfo> userInfos, BasicCallback callback);

获取聊天室管理员用户列表

Since 2.8.0

  1. /**
  2. * 获取聊天室的房管用户列表
  3. *
  4. * @param roomID 聊天室的roomID
  5. * @param callback 回调
  6. * @since 2.8.0
  7. */
  8. ChatRoomManager.getChatRoomAdminList(long roomID, RequestCallback<List<UserInfo>> callback);

聊天室黑名单

Since 2.8.0

将用户添加至聊天室黑名单

Since 2.8.0

  1. /**
  2. * 将用户添加至聊天室黑名单,只有聊天室的房主和房管有此权限, 被设置黑名单用户会被立即踢出聊天室。
  3. *
  4. * @param roomID 聊天室的roomID
  5. * @param userInfos 准备加入聊天室黑名单的用户userInfo集合
  6. * @param callback
  7. * @since 2.8.0
  8. */
  9. ChatRooomManager.addChatRoomBlacklist(long roomID, List<UserInfo> userInfos, BasicCallback callback);

将用户从聊天室黑名单中移除

Since 2.8.0

  1. /**
  2. * 将用户从聊天室黑名单中移除,只有聊天室的房主和房管有此权限
  3. *
  4. * @param roomID 聊天室的roomID
  5. * @param userInfos 准备移出聊天室黑名单的用户userInfo集合
  6. * @param callback 回调
  7. * @since 2.8.0
  8. */
  9. ChatRooomManager.delChatRoomBlacklist(long roomID, List<UserInfo> userInfos, BasicCallback callback);

获取聊天室的黑名单用户列表

Since 2.8.0

  1. /**
  2. * 获取聊天室的黑名单用户列表,按照被拉黑时间倒序排列
  3. *
  4. * @param roomID 聊天室的roomID
  5. * @param callback 回调
  6. * @since 2.8.0
  7. */
  8. ChatRoomManager.getChatRoomBlacklist(long roomID, RequestCallback<List<UserInfo>> callback);

聊天室禁言

Since 2.8.2聊天室owner或者管理员可以禁言聊天室成员

将指定用户添加进聊天室的禁言列表

  1. /**
  2. * 将指定用户添加进聊天室的禁言列表(批量设置一次最多500个),禁言时间下限5分钟,上限1年
  3. * 聊天室owner或者管理员可以禁言聊天室成员,管理员或owner不能被禁言, 重复调用此接口将根据当前时间重新计算结束时间。
  4. * 禁言成功聊天室成员会收到{@link cn.jpush.im.android.api.event.ChatRoomNotificationEvent}
  5. *
  6. * @param roomId 聊天室的roomId
  7. * @param userInfos 准备加入聊天室禁言名单的用户
  8. * @param times 禁言时间,单位:毫秒,禁言时间最少5分钟(300000毫秒),最长一年(31536000000毫秒) 即300000 <= times <= 31536000000
  9. * @param callback 禁言结果回调
  10. * @since 2.8.2
  11. */
  12. ChatRoomManager.addChatRoomSilence(long roomId, Collection<UserInfo> userInfos, long times, BasicCallback callback);

将指定用户从聊天室禁言列表中移除

  1. /**
  2. * 将指定用户从聊天室禁言名单中移除(批量设置一次最多500个)
  3. * 只有房主和管理员可设置,取消成功聊天室成员会收到{@link cn.jpush.im.android.api.event.ChatRoomNotificationEvent}
  4. *
  5. * @param roomId 聊天室的roomId
  6. * @param userInfos 将要被解除禁言的用户信息,size <= 500
  7. * @param callback 解除禁言结果回调
  8. * @since 2.8.2
  9. */
  10. ChatRoomManager.delChatRoomSilence(long roomId, Collection<UserInfo> userInfos, BasicCallback callback);

获取聊天室禁言列表

  1. /**
  2. * 获取聊天室禁言列表以添加入禁言的先后的时间倒序排序(后加入的在前),从start位置开始获取count个禁言信息。
  3. * 例如总共20个被禁言,分页每次获取15人,第一次获取 start: 0, count : 15,返回15个人的禁言信息,第二次获取 start : 15, count : 15 返回5个人的禁言信息。
  4. * 禁言用户总数在回调中会返回。
  5. *
  6. * @param roomId 聊天室的roomId
  7. * @param start 获取禁言列表开始位置,从第 start 个开始,start >= 0
  8. * @param count 获取禁言信息数量, count > 0
  9. * @param callback 结果回调{@link GetChatRoomSilencesCallback}
  10. * @since 2.8.2
  11. */
  12. ChatRoomManager.getChatRoomSilencesFromNewest(long roomId, int start, int count, GetChatRoomSilencesCallback callback);

查询用户在聊天室的禁言状态

  1. /**
  2. * 获取用户在聊天室的禁言状态,如果用户未处于禁言状态,回调中SilenceInfo为null
  3. *
  4. * @param roomId 聊天室的roomId
  5. * @param username 用户名
  6. * @param appkey 用户所在应用 AppKey,不填这默认本应用
  7. * @param callback 结果回调, 如果用户未处于禁言状态,回调中SilenceInfo为null
  8. * @since 2.8.2
  9. */
  10. ChatRoomManager.getChatRoomMemberSilence(final long roomId, String username, String appkey, final RequestCallback<SilenceInfo> callback);

聊天室通知事件

聊天室管理员和黑名单,禁言列表变更时会下发此事件Since 2.8.0

  1. ChatRoomNotificationEvent

聊天室相关代码示例

  1. // 获取当前应用appkey所属下聊天室信息
  2. ChatRoomManager.getChatRoomListByApp(start, count, new RequestCallback<List<ChatRoomInfo>>() {
  3. @Override
  4. public void gotResult(int responseCode, String responseMessage, List<ChatRoomInfo> chatRoomInfos) {
  5. String result = null != chatRoomInfos ? chatRoomInfos.toString() : null;
  6. postTextToDisplay("getChatRoomListByApp", responseCode, responseMessage, result);
  7. }
  8. });
  9. // 获取当前用户所加入的所有聊天室的信息
  10. ChatRoomManager.getChatRoomListByUser(new RequestCallback<List<ChatRoomInfo>>() {
  11. @Override
  12. public void gotResult(int responseCode, String responseMessage, List<ChatRoomInfo> chatRoomInfos) {
  13. String result = null != chatRoomInfos ? chatRoomInfos.toString() : null;
  14. postTextToDisplay("getChatRoomListByUser", responseCode, responseMessage, result);
  15. }
  16. });
  17. // 查询指定roomID的聊天室信息
  18. ChatRoomManager.getChatRoomInfos(Collections.singleton(roomID), new RequestCallback<List<ChatRoomInfo>>() {
  19. @Override
  20. public void gotResult(int responseCode, String responseMessage, List<ChatRoomInfo> chatRoomInfos) {
  21. String result = null != chatRoomInfos ? chatRoomInfos.toString() : null;
  22. postTextToDisplay("getChatRoomInfos", responseCode, responseMessage, result);
  23. }
  24. });
  25. // 进入聊天室
  26. ChatRoomManager.enterChatRoom(roomID, new RequestCallback<Conversation>() {
  27. @Override
  28. public void gotResult(int responseCode, String responseMessage, Conversation conversation) {
  29. String result = null != conversation ? conversation.toString() : null;
  30. postTextToDisplay("enterChatRoom", responseCode, responseMessage, result);
  31. }
  32. });
  33. // 离开聊天室
  34. ChatRoomManager.leaveChatRoom(roomID, new BasicCallback() {
  35. @Override
  36. public void gotResult(int responseCode, String responseMessage) {
  37. postTextToDisplay("leaveChatRoom", responseCode, responseMessage, null);
  38. }
  39. });
  40. // 发送聊天室消息
  41. Conversation conv = JMessageClient.getChatRoomConversation(roomID);
  42. if (null == conv) {
  43. conv = Conversation.createChatRoomConversation(roomID);
  44. }
  45. String text = etInputText.getText().toString();
  46. final Message msg = conv.createSendTextMessage(text);//实际聊天室可以支持所有类型的消息发送,demo为了简便,仅仅实现了文本类型的消息发送,其他的消息类型参考消息发送相关文档
  47. msg.setOnSendCompleteCallback(new BasicCallback() {
  48. @Override
  49. public void gotResult(int responseCode, String responseMessage) {
  50. if (0 == responseCode) {
  51. postMessageToDisplay("MessageSent", responseCode, responseMessage, msg);
  52. } else {
  53. postTextToDisplay("MessageSent", responseCode, responseMessage, "消息发送失败");
  54. }
  55. }
  56. });
  57. JMessageClient.sendMessage(msg);
  58. // 接收聊天室消息
  59. public void onEventMainThread(ChatRoomMessageEvent event) {
  60. Log.d("tag", "ChatRoomMessageEvent received .");
  61. List<Message> msgs = event.getMessages();
  62. for (Message msg : msgs) {
  63. //这个页面仅仅展示聊天室会话的消息
  64. postMessageToDisplay("MessageReceived", event.getResponseCode(), event.getResponseDesc(), msg);
  65. }
  66. }
  67. // 设置聊天室管理员
  68. ChatRoomManager.addChatRoomAdmin(roomID, Collections.singletonList(info), new BasicCallback() {
  69. @Override
  70. public void gotResult(int responseCode, String responseMessage) {
  71. if (0 == responseCode) {
  72. postTextToDisplay("addChatRoomAdmin", responseCode, responseMessage, null);
  73. } else {
  74. postTextToDisplay("addChatRoomAdmin", responseCode, responseMessage, "设置房管失败");
  75. }
  76. }
  77. });
  78. // 取消聊天室管理员
  79. ChatRoomManager.delChatRoomAdmin(roomID, Collections.singletonList(info), new BasicCallback() {
  80. @Override
  81. public void gotResult(int responseCode, String responseMessage) {
  82. if (0 == responseCode) {
  83. postTextToDisplay("delChatRoomAdmin", responseCode, responseMessage, null);
  84. } else {
  85. postTextToDisplay("delChatRoomAdmin", responseCode, responseMessage, "取消房管失败");
  86. }
  87. }
  88. });
  89. // 获取聊天室管理员用户列表
  90. ChatRoomManager.getChatRoomAdminList(roomID, new RequestCallback<List<UserInfo>>() {
  91. @Override
  92. public void gotResult(int responseCode, String responseMessage, List<UserInfo> result) {
  93. if (0 == responseCode) {
  94. StringBuilder builder = new StringBuilder();
  95. if (result.size() > 0) {
  96. for (UserInfo userInfo : result) {
  97. builder.append(userInfo.getUserName()).append("\n");
  98. }
  99. } else {
  100. builder.append("该聊天室还没有房管");
  101. }
  102. postTextToDisplay("getChatRoomAdminList", responseCode, responseMessage, builder.toString());
  103. } else {
  104. postTextToDisplay("getChatRoomAdminList", responseCode, responseMessage, "获取聊天室房管列表失败");
  105. }
  106. }
  107. });
  108. // 将用户添加至聊天室黑名单
  109. ChatRoomManager.addChatRoomBlacklist(roomID, Collections.singletonList(info), new BasicCallback() {
  110. @Override
  111. public void gotResult(int responseCode, String responseMessage) {
  112. if (0 == responseCode) {
  113. postTextToDisplay("addChatRoomBlacklist", responseCode, responseMessage, null);
  114. } else {
  115. postTextToDisplay("addChatRoomBlacklist", responseCode, responseMessage, "添加聊天室黑名单失败");
  116. }
  117. }
  118. });
  119. // 将用户从聊天室黑名单中移除
  120. ChatRoomManager.delChatRoomBlacklist(roomID, Collections.singletonList(info), new BasicCallback() {
  121. @Override
  122. public void gotResult(int responseCode, String responseMessage) {
  123. if (0== responseCode) {
  124. postTextToDisplay("delChatRoomBlacklist", responseCode, responseMessage, null);
  125. } else {
  126. postTextToDisplay("delChatRoomBlacklist", responseCode, responseMessage, "从黑名单中移除失败");
  127. }
  128. }
  129. });
  130. // 获取聊天室的黑名单用户列表
  131. ChatRoomManager.getChatRoomBlacklist(roomID, new RequestCallback<List<UserInfo>>() {
  132. @Override
  133. public void gotResult(int responseCode, String responseMessage, List<UserInfo> result) {
  134. if (0 == responseCode) {
  135. StringBuilder builder = new StringBuilder();
  136. if (result.size() > 0) {
  137. for (UserInfo userInfo : result) {
  138. builder.append(userInfo.getUserName()).append("\n");
  139. }
  140. } else {
  141. builder.append("该聊天室黑名单列表为空");
  142. }
  143. postTextToDisplay("getChatRoomAdminList", responseCode, responseMessage, builder.toString());
  144. } else {
  145. postTextToDisplay("getChatRoomAdminList", responseCode, responseMessage, "获取聊天室黑名单列表失败");
  146. }
  147. }
  148. });
  149. // 将指定用户添加进聊天室的禁言列表
  150. ChatRoomManager.addChatRoomSilence(roomId, Collections.singletonList(info), times, new BasicCallback() {
  151. @Override
  152. public void gotResult(int responseCode, String responseMessage) {
  153. if (0 == responseCode) {
  154. postTextToDisplay("addChatRoomSilence", responseCode, responseMessage, null);
  155. } else {
  156. postTextToDisplay("addChatRoomSilence", responseCode, responseMessage, "设置禁言失败");
  157. }
  158. }
  159. });
  160. // 将指定用户从聊天室禁言名单中移除
  161. ChatRoomManager.delChatRoomSilence(roomId, Collections.singletonList(info), new BasicCallback() {
  162. @Override
  163. public void gotResult(int responseCode, String responseMessage) {
  164. if (0 == responseCode) {
  165. postTextToDisplay("delChatRoomSilence", responseCode, responseMessage, null);
  166. } else {
  167. postTextToDisplay("delChatRoomSilence", responseCode, responseMessage, "设置禁言失败");
  168. }
  169. }
  170. });
  171. // 获取聊天室禁言列表
  172. ChatRoomManager.getChatRoomSilencesFromNewest(roomID, silenceStart, silenceCount, new GetChatRoomSilencesCallback() {
  173. @Override
  174. public void gotResult(int responseCode, String responseMessage, List<SilenceInfo> silenceInfos, int total) {
  175. if (0 == responseCode) {
  176. StringBuilder builder = new StringBuilder();
  177. builder.append("聊天室禁言总量:").append(total).append(",本次获取到数量:")
  178. .append(silenceInfos.size()).append("\n");
  179. if (silenceInfos.size() > 0) {
  180. for (SilenceInfo silenceInfo : silenceInfos) {
  181. builder.append("username:").append(silenceInfo.getUserInfo().getUserName()).append("\n");
  182. builder.append("silenceStart:").append(silenceInfo.getSilenceStartTime()).append("\n");
  183. builder.append("silenceEnd:").append(silenceInfo.getSilenceEndTime()).append("\n\n");
  184. }
  185. }
  186. postTextToDisplay("getChatRoomAdminList", responseCode, responseMessage, builder.toString());
  187. } else {
  188. postTextToDisplay("getChatRoomAdminList", responseCode, responseMessage, "获取禁言列表失败");
  189. }
  190. }
  191. });
  192. // 查询用户在聊天室的禁言状态
  193. ChatRoomManager.getChatRoomMemberSilence(roomID, username, appkey, new RequestCallback<SilenceInfo>() {
  194. @Override
  195. public void gotResult(int responseCode, String responseMessage, SilenceInfo result) {
  196. if (0 == responseCode) {
  197. StringBuilder builder = new StringBuilder();
  198. if (result != null) {
  199. builder.append("usname:").append(result.getUserInfo().getUserName()).append("\n");
  200. builder.append("silenceStart:").append(result.getSilenceStartTime()).append("\n");
  201. builder.append("silenceEnd:").append(result.getSilenceEndTime()).append("\n");
  202. } else {
  203. builder.append("该用户没有被禁言");
  204. }
  205. postTextToDisplay("getChatRoomMemberSilence", responseCode, responseMessage, builder.toString());
  206. } else {
  207. postTextToDisplay("getChatRoomMemberSilence", responseCode, responseMessage, "获取用户禁言状态失败");
  208. }
  209. }
  210. });