2013-03-20 38 views
3

經過幾個小時的調試,並試圖找出爲什麼文件傳輸不起作用使用aSmack,而正常的消息傳遞時,我終於設法把它放在這。Smack的FileTransferManager.createOutgoingFileTransfer只接受完整的JID。我如何確定Smack中用戶的完整JID?

當我按照Smack文檔中給出的方法獲取用戶的名單時,Openfire服務器發送的Rosters'JID缺少/最後。

Collection<RosterEntry> entries = roster.getEntries(); 
for (RosterEntry r : entries) { 
    Log.v("Gabriel","Receiving: " + r.getUser()); 
}  

例如,如果我從用戶加布裏埃爾收到一條消息,我得到了「從」爲:

[email protected]/Smack 

但r.getUser()返回給用戶

[email protected] 

即使

connection.getRoster().getPresence(contactName).getFrom() 

正在恢復就像「gabriel @ dragonov」一樣。

這會導致文件傳輸失敗,但奇怪的不是常規消息。但是,當我手動添加/ Smack在

OutgoingFileTransfer transferr = manager.createOutgoingFileTransfer(contactJID+"/Smack"); 

它的工作結束。

我的問題是,我如何接收包含資源部分的完整JID或配置文件傳輸,以便在使用裸露的JID時不會失敗?


編輯:

我曾嘗試以下方法:

Log.v("Gabriel", entries.size() + " buddy(ies):"); 
    for (RosterEntry r : entries) { 
     Log.v("Pat","adding: " + r.getType() + " " + r.getName()); 
     contacts.add(r.getUser()); 
    }  

    for (String contact : contacts){ 
     Iterator<org.jivesoftware.smack.packet.Presence> presences = connection.getRoster().getPresences(contact); 
     Log.v("Gabriel", contact+" has: "); 
     while(presences.hasNext()){ 
      Log.v("Gabriel",presences.next().getFrom()); 
     }   
    } 

但我仍然得到裸ID。

輸出: 加布裏埃爾@ dragonov有: 加布裏埃爾@ dragonov

回答

0

使用Iterator<Presence> Roster.getPresences(String user)獲得來自用戶的所有已知資源存在的信息。對於此Presence實例getFrom()應返回完整的JID,您可以在FileTransferManager.createOutgoingFileTransfer()中使用該JID。

我已經創建了SMACK-430,關於在createOutgoingFileTranfer()中使用完整的JID。它確實應該拋出一個異常,以致於smack用戶不必調試幾小時以找到原因(雖然它在javadoc方法中說明)。 SMACK-430還解釋了爲什麼FileTransferManager需要一個完整的JID,並且不能用於純粹的JID。

+0

我的不好。我以爲我在某處說過我使用asmack,但似乎我沒有。 Roster.getPresences不是一個可用的方法,它看起來像:( – Gabriel 2013-03-20 10:51:46

+0

啊,沒關係,我發現它在connection.getRoster()。我已經嘗試了你說的,但我仍然得到裸露的JID。請檢查我的問題上面,我編輯它 – Gabriel 2013-03-20 10:54:10

+0

你應該更新你的aSmack版本,如果你使用的是舊版本。aSmack肯定有'Roster.getPresences()'。 – Flow 2013-03-20 12:56:45