2013-02-13 40 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)(單數)將返回可用。

該名冊還允許您設置/更改這些優先順序/排序,如果你想。希望這可以幫助別人!