2013-02-13 41 views
1

我想更新三个客户端上的存在其中两个是Adium & Pidgin和我的一个自定义生成应用程序。当我从我的应用程序发送的存在它的工作原理可用,状态设置为“室内”:存在多个资源smack

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,有些事情出错了。我实现了在场听众报文:如果我改变从洋泾浜或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)); 
+0

我想你想写的听者永远不会被解雇,对吧? – Flow 2013-02-13 18:07:22

+0

它肯定会发生,我得到我自己的存在,但是当我得到我的存在后,如果我尝试发送新的存在vis.sendPacket(pres)。它不断开始发送状态。 – 2013-02-13 18:34:17

回答

0

要和一个自定义PresencePacketListener是98%错误的做法。相反,您希望添加自己的RosterListenerRoster.addRosterListener(),以对名单中存在的实体进行反应。

确保两个叽里咕噜机构从或至少订阅模式,使服务器将转发存在诗节给你的客户。

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

+0

但我不希望其他订户的存在,但如果它来自不同的IM客户端,则存在相同的帐户。 Roster.addlistener()只能获得名单列表/好友列表。我通过自定义侦听器从其他资源获取我自己的存在。我的问题是,如果我从一个客户端更改状态,我该如何更新我在多个客户端上的状态....希望你能理解 – 2013-02-13 18:31:56

+0

也许你应该改述你的问题,然后尝试找到一个好的标题。如果涉及具有不同呈现信息的多个资源,则另一客户端决定如何显示裸露的JID。 – Flow 2013-02-13 18:52:15

0

我刚刚阅读了您对Flow的评论,此答案已晚,但其他人可能需要相同;

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

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

的文档here涵盖的话题和动态供应基本上解释了不同的模式有不同的优先级,所以(例如)如果任何客户端已经'可用'然后使用Roster#getPresence(username)(单数)将返回可用。

该名册还允许您设置/更改这些优先顺序/排序,如果你想。希望这可以帮助别人!