【问题标题】:Smack's FileTransferManager.createOutgoingFileTransfer only accepts full JIDs. How can I determine the full JID of a user in Smack?Smack 的 FileTransferManager.createOutgoingFileTransfer 只接受完整的 JID。如何确定 Smack 中用户的完整 JID?
【发布时间】:2013-03-09 05:54:12
【问题描述】:

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

当我按照 Smack 文档中给出的方法获取用户的名册列表时,Openfire 服务器发送的名册 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());
        }           
    }

但我仍然得到了裸 ID。

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

【问题讨论】:

    标签: xmpp file-transfer smack asmack


    【解决方案1】:

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

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

    【讨论】:

    • 我的错。我以为我在某处提到我正在使用 asmack,但似乎我没有。 Roster.getPresences 似乎不是一个可用的方法:(
    • 啊,没关系。我发现它在 connection.getRoster() 中。我已经按照您所说的进行了尝试,但我仍然得到了裸露的 JID。请检查我上面的问题,我编辑了它。
    • 如果您使用的是旧版本,您应该更新您的 aSmack 版本。 aSmack 肯定有Roster.getPresences()
    • 那个版本应该有getPresences()
    • 很奇怪。 Roster 仅有的两个静态方法是 Roster.getDefaultSubscriptionMode() 和 Roster.setDefaultSubscriptionMode(subscriptionMode)
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多