• 聊天室管理
    • 概述
      • 聊天室对象
      • 获取应用下聊天室列表
      • 获取当前用户加入的聊天室列表
      • 查询指定roomID的聊天室信息
      • 进入聊天室
      • 离开聊天室
      • 获取聊天室会话
      • 创建聊天室会话
      • 删除聊天室会话
      • 聊天室消息
      • 聊天室管理员
        • 设置聊天室管理员
        • 取消聊天室管理员
        • 获取聊天室管理员用户列表
      • 聊天室黑名单
        • 将用户添加至聊天室黑名单
        • 将用户从聊天室黑名单中移除
        • 获取聊天室的黑名单用户列表
      • 聊天室禁言
        • 将指定用户添加进聊天室的禁言列表
        • 将指定用户从聊天室禁言列表中移除
        • 获取聊天室禁言列表
        • 查询用户在聊天室的禁言状态
      • 聊天室通知事件
      • 聊天室相关代码示例

    聊天室管理

    概述

    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. });