Smack的FileTransferManager.createOutgoingFileTransfer只接受完整的JID。如何确定Smack中用户的完整JID?

时间:2013-03-20 08:19:30

标签: xmpp file-transfer smack asmack

经过几个小时的调试并试图找出文件传输无法使用aSmack工作的原因,而正常的消息传递是,我终于设法将其归结为此。

当我按照Smack文档中给出的方法获取用户的名单列表时,Openfire服务器发送的Rosters的JID缺少/。

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

例如,如果我收到用户gabriel发来的消息,我会将“发件人”作为:

gabriel@dragonov/Smack

但是r.getUser()以

的形式返回给用户
gabriel@dragonov

即使

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());
        }           
    }

但我仍然得到了裸照。

输出:     gabriel @ dragonov有:     加布里埃尔@ dragonov

1 个答案:

答案 0 :(得分:0)

使用Iterator<Presence> Roster.getPresences(String user)从用户的所有已知资源中获取状态信息。对于此Presence实例,getFrom()应返回一个完整的JID,您可以在FileTransferManager.createOutgoingFileTransfer()中使用。

我创建了SMACK-430,关于在createOutgoingFileTranfer()中使用完整的JID。它确实应该抛出一个异常,以便smack用户不必调试时间来找到原因(虽然它在方法javadoc中说明)。 SMACK-430还解释了为什么FileTransferManager需要一个完整的JID,并且不能与裸JID一起使用。