2011-04-27 75 views
16

我使用的是smack 3.1.0,當我添加一個名冊時,我無法獲得訂閱「兩個」。誰能幫我?下面 是我的代碼:如何添加名冊與訂閱模式「兩個」

Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all); 
Roster roster = connection.getRoster(); 
roster.createEntry("[email protected]","me",null) 

代碼執行後,我觀察到的Openfire訂閱是「到」

回答

9

兩個用戶需要訂閱對方。通過發送狀態訂閱節。在Smack中:

Presence presence = new Presence(Presence.Type.subscribe); 
    presence.setTo(jid); 
    connection.sendPacket(presence); 

Section 3.1 of the RFC6121會給你語義細節。

+0

非常感謝,那就是我一直在尋找的! – vsm 2011-07-14 21:48:24

+0

如果用戶從任何其他來源添加,偵聽數據包偵聽器併發送Subscribe to jid,這是如何工作的,您可以在名單列表中看到訂閱爲「both」。如果使用類型訂閱,則訂閱將從(名單發送請求)和(發送請求發送給名單) – Zoombie 2012-03-12 13:15:12

+0

你好。但是在哪裏寫這兩個代碼用於訂閱雙方 – 2012-05-22 08:41:12

37

重寫@ mschonaker的答案會更清楚一點。

兩個用戶需要互相訂閱接受他們收到的訂閱請求。我們稱他們爲Alice和Bob。 Alice發送訂閱請求鮑勃:

Presence subscribe = new Presence(Presence.Type.subscribe); 
subscribe.setTo('[email protected]'); 
connection.sendPacket(subscribe); 

當Bob收到請求後,他批准:

Presence subscribed = new Presence(Presence.Type.subscribed); 
subscribed.setTo('[email protected]'); 
connection.sendPacket(subscribed); 

鮑勃還可能有興趣在愛麗絲的存在,所以他贊同她:

Presence subscribe = new Presence(Presence.Type.subscribe); 
subscribe.setTo('[email protected]'); 
connection.sendPacket(subscribe); 

還有愛麗絲需要批准Bob的要求:

Presence subscribed = new Presence(Presence.Type.subscribed); 
subscribed.setTo('[email protected]'); 
connection.sendPacket(subscribed); 

Section 3.1 of RFC6121是當前如何工作的最佳參考。

+1

你好。但在哪裏寫這兩個代碼訂閱雙方 – 2012-05-22 06:45:16

+0

如果我使用訂閱什麼,我必須在這裏使用JID subscribed.setTo(jid);我可以添加條目到我的賬戶,但我沒有得到那個條目的存在。爲此我要做些什麼。 – 2012-10-25 12:53:18

+0

我希望我說得更清楚。 – 2012-10-29 21:56:59

2

好的,我在這工作了幾天,終於有了工作。謝謝@Joe Hildebrand,你的回答讓我走上了正確的道路來解決這個問題。我已經用手動訂閱模式實現了它(即,用戶需要手動接受其他用戶的請求)。

如果用戶沒有發送訂閱或退訂,服務器會一直向用戶推送訂閱請求(在重新登錄時)。因此,您可以將傳入的訂閱請求本地保存在列表中,並將其顯示爲手動接受/拒絕的「朋友請求列表」。如果您的應用程序重新啓動(並因此重新連接到服務器),服務器將再次推送訂閱請求。

這是它如何工作的:

  • 用戶1發送訂閱存在用戶2。
  • 花名冊條目會自動在User1的花名冊中創建(但不在User2的花名冊中)。
  • 用戶2接收來自用戶1的訂閱請求。
  • 用戶2向用戶2發送訂閱的狀態(用戶2>用戶1訂閱完成)。
  • User2檢查User1是否在User2的名單中。 User1不在User2的名單中。用戶2向用戶1發送訂閱狀態。
  • 名冊條目會自動在User2的名單中創建。
  • 用戶1接收來自用戶2的訂閱存在。
  • User1檢查User2是否在User1的名單中。 User2在User1的名單中。用戶1向用戶2發回訂閱的狀態(用戶2>用戶1訂閱完成)。

     final Presence newPresence = (Presence) packet; 
         final Presence.Type presenceType = newPresence.getType(); 
         final String fromId = newPresence.getFrom(); 
         final RosterEntry newEntry = getRoster().getEntry(fromId); 
    
         if (presenceType == Presence.Type.subscribe) 
         { 
          //from new user 
          if (newEntry == null) 
          { 
           //save request locally for later accept/reject 
           //later accept will send back a subscribe & subscribed presence to user with fromId 
           //or accept immediately by sending back subscribe and unsubscribed right now 
          } 
          //from a user that previously accepted your request 
          else 
          { 
           //send back subscribed presence to user with fromId 
          } 
         } 
    
1

如果您正在使用明火的服務器,你也可以使用User Service plugin,這將創造名冊訂閱都...

1

同樣的問題我的臉,但我得到了解決如何訂閱設置「既有」

下面是發送訂閱用戶,當您添加的用戶

Presence pres = new Presence(Presence.Type.subscribed); 
     pres.setPriority(24); 
     pres.setMode(Presence.Mode.available); 
     pres.setTo(friendJid); 

     RoosterConnection.getConnection().sendStanza(pres); 

和接收端將下面的方法放在連接類中,而presenceChanged是RosterListener的默認方法。

@Override 
public void presenceChanged(Presence presence) { 
    mBus.post(presence); 
    try { 
     Presence pres = new Presence(Presence.Type.subscribed); 
     pres.setTo(presence.getFrom()); 
     RoosterConnection.getConnection().sendStanza(pres); 
    } catch (SmackException.NotConnectedException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
}