You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 01:30:03