1

我正在尝试更新三个客户端的存在,其中两个是 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 可以相互配合。我意识到由于我的应用程序出了点问题。我实现了存在数据包侦听器:如果我从 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));
4

2 回答 2

0

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

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

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

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

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

于 2014-03-05T17:01:19.880 回答
0

98% 的习惯PresencePacketListener是错误的做法。相反,您想添加自己的RosterListenerwithRoster.addRosterListener()以对名册中实体的存在变化做出反应。

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

如果您想获取您帐户的其他资源/完整 JID 的存在。尝试Roster.getPresences(StringUtils.parseBareAddress(connection.getUser()))

于 2013-02-13T18:06:55.287 回答