Xmpp 在多个资源上的存在有点奇怪

Xmpp 在多个资源上的存在有点奇怪,xmpp,smack,Xmpp,Smack,我正在尝试更新三个客户端的状态,其中两个是Adium&Pidgin,另一个是我的定制构建应用程序。当我从应用程序发送状态信息时,它会将可用状态设置为“房间内”: 但当我从其他IM(比如Adium)更新状态时,它无法更新状态和状态。当我从我的应用程序更新状态时,other wise Adium和Pidgin会相互配合。我意识到我的应用程序出了问题。我实现了状态包侦听器:如果我将状态从Pidgin或Adium更改为此侦听器正在侦听,它应该侦听 connection.addPacketListener

我正在尝试更新三个客户端的状态,其中两个是Adium&Pidgin,另一个是我的定制构建应用程序。当我从应用程序发送状态信息时,它会将可用状态设置为“房间内”:

但当我从其他IM(比如Adium)更新状态时,它无法更新状态和状态。当我从我的应用程序更新状态时,other wise Adium和Pidgin会相互配合。我意识到我的应用程序出了问题。我实现了状态包侦听器:如果我将状态从Pidgin或Adium更改为此侦听器正在侦听,它应该侦听

connection.addPacketListener(new PacketListener(){

        @Override
        public void processPacket(Packet presencePkt) {

            Presence pres= ((Presence) presencePkt);
            presence.setPriority(1);// presence is global variable 

        switch(pres.getMode()){
            case available: presence.setMode(pres.getMode());
                            //connection.sendPacket(pres);
            break;
            case dnd: presence.setMode(pres.getMode());
                     //connection.sendPacket(pres);
            break;

            default :
                break;

        }


    }

}, new PacketTypeFilter(Presence.class));

使用定制的
PresencePacketListener
是98%的错误方法。相反,您希望添加您自己的,以对名册中实体的状态变化作出反应

确保两个jabber实体至少具有来自或两者的订阅模式,以便服务器将状态节转发到您的客户端


如果您想获得您帐户的其他资源/完整JID的存在。试试看

我刚刚读了你的评论,这个答案很晚了,但其他人可能需要同样的答案

答案仍然是按照Flow的建议使用
RosterListener
(基于我使用Smack的经验)

使用RosterListener,您将收到您自己用户以及其他用户的状态更改(发送和发送都是您自己的用户名)。这意味着花名册正在跟踪您,因此您可以使用
花名册#getPresences(username)
方法从不同来源获取您的状态的有序列表,您可以使用
花名册#getUser()

该文档涵盖了该主题,并基本上解释了不同的模式具有不同的优先级,因此(例如)如果有任何客户让您“可用”,那么使用
花名册#getPresence(username)
(单数)将返回可用


如果您愿意,花名册还允许您设置/更改这些优先级/顺序。希望这对别人有帮助

我想你想写的是,侦听器从未被解雇,对吗?它当然会被解雇,我也会获得自己的状态,但在获得状态后,如果我尝试发送新的状态vis connection.sendpack(pres)。它不断地开始发送状态。但我不希望其他订阅者的状态,但如果它是来自不同IM客户端的登录,则希望相同帐户的状态。addlistener()只能获取花名册列表/好友列表。我通过自定义侦听器从其他资源获得自己的状态。我的问题是,如果我从一个客户端更改状态,如何在多个客户端上更新状态。。。。希望你理解Maybe你应该重新措辞你的问题,然后试着找到一个好标题。如果涉及具有不同状态信息的多个资源,则另一个客户端决定如何显示裸JID。
connection.addPacketListener(new PacketListener(){

        @Override
        public void processPacket(Packet presencePkt) {

            Presence pres= ((Presence) presencePkt);
            presence.setPriority(1);// presence is global variable 

        switch(pres.getMode()){
            case available: presence.setMode(pres.getMode());
                            //connection.sendPacket(pres);
            break;
            case dnd: presence.setMode(pres.getMode());
                     //connection.sendPacket(pres);
            break;

            default :
                break;

        }


    }

}, new PacketTypeFilter(Presence.class));