Xmpp Smack';s FileTransferManager.createOutgoingFileTransfer仅接受完整JID。如何确定Smack中用户的完整JID?

Xmpp Smack';s FileTransferManager.createOutgoingFileTransfer仅接受完整JID。如何确定Smack中用户的完整JID?,xmpp,file-transfer,smack,asmack,Xmpp,File Transfer,Smack,Asmack,经过数小时的调试,并试图找出为什么使用aSmack进行的文件传输无法正常工作,而正常的消息传递却无法正常工作,我终于找到了原因 当我按照Smack文档中给出的方法获取用户的花名册列表时,Openfire服务器正在发送花名册的JID,但最后缺少了/ Collection<RosterEntry> entries = roster.getEntries(); for (RosterEntry r : entries) { Log.v("Gabriel","Receiving: "

经过数小时的调试,并试图找出为什么使用aSmack进行的文件传输无法正常工作,而正常的消息传递却无法正常工作,我终于找到了原因

当我按照Smack文档中给出的方法获取用户的花名册列表时,Openfire服务器正在发送花名册的JID,但最后缺少了/

Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry r : entries) {
    Log.v("Gabriel","Receiving: " + r.getUser());
}      
但是r.getUser()返回给用户作为

gabriel@dragonov
甚至

正在返回的是“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());
        }           
    }
Log.v(“Gabriel”,entries.size()+“buddy:”);
对于(名册r:条目){
Log.v(“Pat”,“adding:”+r.getType()+“”+r.getName());
contacts.add(r.getUser());
}      
用于(字符串联系人:联系人){
迭代器呈现=connection.get花名册().getPresences(联系人);
Log.v(“Gabriel”,contact+“has:”);
while(presences.hasNext()){
Log.v(“Gabriel”,presences.next().getFrom());
}           
}
但我还是拿到了身份证

输出: gabriel@dragonov有: gabriel@dragonov

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


关于在
createOutgoingFileTransfer()
中使用完整JID,我已经创建了。它真的应该抛出一个异常,这样smack用户就不必花数小时调试才能找到原因(尽管javadoc方法中已经说明了这一点)。SMACK-430还解释了为什么FileTransferManager需要一个完整的JID,而不能与一个简单的JID一起使用。

My bad。我想我在某个地方提到我在使用asmack,但似乎我没有。花名册.getPresences在那里似乎不是一个可用的方法:(啊,没关系。我在连接中找到了它。getPresences()。我已经按照你说的那样尝试了,但我仍然得到了最简单的JID。请检查我上面的问题,我编辑了它。如果你使用的是旧版本,你应该更新你的aSmack版本。aSmack肯定有
花名册.getPresences()
。该版本应该有
getPresences()
奇怪。花名册仅有的两个静态方法是花名册.getDefaultSubscriptionMode()和花名册.setDefaultSubscriptionMode(subscriptionMode)
 OutgoingFileTransfer transferr = manager.createOutgoingFileTransfer(contactJID+"/Smack");
 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());
        }           
    }