使用Smack如何自动加入聊天室及获取用户所在聊天室列表
解决方案
1. 自动加入被邀请的新建聊天室
给MucManager注册全局邀请监听器,其他用户把你拉入新聊天室时会触发邀请回调,直接调用你已实现的joinRoom方法即可自动加入,示例代码如下:
// 连接建立成功后立即注册邀请监听器 mucManager.addInvitationListener(new InvitationListener() { @Override public void invitationReceived(XMPPConnection conn, MultiUserChat room, EntityJid inviter, String reason, String password, Message message, MUCUser.Invite invitation) { // 收到邀请后直接加入房间,昵称用自己的用户ID即可,可根据需求调整 joinRoom(room.getRoomJid().toString(), conn.getUserJid().toString()); } });
注意:监听器必须在连接认证完成后、加入任何聊天室之前注册,避免漏掉推送的邀请。
2. 获取usera作为成员的所有聊天室列表
你当前使用的getHostedRooms接口仅返回对应MUC服务下的公开聊天室,无法返回私有房间、你作为成员的非公开房间,可通过以下两种方式获取:
方式1:读取MUC书签(推荐,覆盖所有成员房间)
XMPP会将用户作为成员的所有聊天室同步存储为云端书签,通过Smack的BookmarkManager可直接读取全量列表:
try { BookmarkManager bookmarkManager = BookmarkManager.getInstanceFor(connection); List<BookmarkedConference> bookmarkedRooms = bookmarkManager.getBookmarkedConferences(); for (BookmarkedConference room : bookmarkedRooms) { Log.info("成员房间JID:{},房间名称:{}", room.getJid(), room.getName()); // 遍历到未加入的房间可直接调用joinRoom加入 if (!mucManager.getJoinedRooms(connection.getUser().asBareJid()).contains(room.getJid())) { joinRoom(room.getJid().toString(), connection.getUserJid().toString()); } } } catch (Exception e) { Log.error("读取MUC书签失败", e); }
方式2:查询当前会话已加入的房间
如果仅需要获取本次连接已经加入的房间,直接调用MucManager自带的查询接口即可:
List<EntityBareJid> joinedRooms = mucManager.getJoinedRooms(connection.getUser().asBareJid()); for (EntityBareJid roomJid : joinedRooms) { Log.info("已加入房间JID:{}", roomJid); }
注意:4.2.1版本的Smack需要确保引入了
smack-extensions依赖,才能正常使用BookmarkManager相关功能,主流XMPP服务端(Openfire、ejabberd)默认都开启了MUC书签同步支持。
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

