存在于多种资源上

时间:2013-02-13 16:00:49

标签: xmpp smack

我正在尝试更新三个客户端的存在,其中两个是Adium& Pidgin和我的自定义构建应用程序。当我从我的应用程序发送状态时,它可以将可用状态和状态设置为“室内”:

 ConnectionConfiguration connConfig =
            new ConnectionConfiguration(host, Integer.parseInt(port), service);
   connection = new XMPPConnection(connConfig);
   presence = new Presence(Presence.Type.available,"In Room",1,Presence.Mode.available);

        connection.sendPacket(presence);

但是当我更新来自其他IM的状态时,可以说Adium,当我从我的APP更新状态时,它无法更新状态和状态,其他明智的Adium和Pidgin相互协作。我意识到由于我的APP,有些事情出了问题。我实现了在线数据包监听器:如果我改变了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));

2 个答案:

答案 0 :(得分:0)

使用自定义PresencePacketListener是98%的错误方法。相反,您希望添加自己的RosterListenerRoster.addRosterListener(),以对您名单中实体的状态更改做出反应。

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

如果您想获得帐户的其他资源/完整JID的状态。试试Roster.getPresences(StringUtils.parseBareAddress(connection.getUser()))

答案 1 :(得分:0)

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

答案仍然是使用Flow建议的RosterListener(根据我使用Smack的经验)。

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

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

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