5

我正在使用 Smack 库在 Android 上开发 XMPP 客户端。名册/消息/存在的东西运行得很好。但是,我没有找到存储其他个人资料信息(用户图片、狗名……)的方法。

我从谷歌搜索中看到的唯一方法是使用 VCards。但它根本不起作用。我尝试了以下方法:

        VCard vCard = new VCard();
        vCard.load(connection);
        vCard.setEmailHome("meine_home@email.de");
        vCard.setLastName("Scheller");
        vCard.setField("blafasel", "asdf");
        vCard.save(connection);

然后我正在寻找一种方法来查看该 VCard 信息。它既没有出现在 iChat 中,也没有出现在这个 System.out 中:

        vCard.load(connection, user);
        System.out.println(user + " has this vCard: " + vCard.toXML());

所以出了什么问题,但没有迹象表明它是什么。我用谷歌谈话服务器和我自己的 openfire 副本尝试了这个,结果相同。顺便说一句,我正在使用这个版本的 Smack:http ://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/

我在这里做错了什么?使用 Smack 存储配置文件相关信息的正确方法是什么?

4

3 回答 3

12

我检查了 Smack 的源代码并使用调试器检查了重要部分,以及使用 Smack 调试窗口。问题出在Smack API的 VCard 实现中。保存 VCard 确实如前所述,但加载中断。

parseIQ(XmlPullParser parser) 是 PacketReader.java 类的一部分,处理不同类型的包。它只处理具有以下命名空间的标签:

“jabber:iq:auth”、“jabber:iq:roster”、“jabber:iq:register”、“urn:ietf:params:xml:ns:xmpp-bind”

它还会查看 ProviderManager 中是否有任何已注册的 IQProvider。这是我问题的根源。没有为 VCards 注册的 IQProvider。因此,vCard 标签内的任何信息都会被丢弃。

不过,注册这个 IQProvider 并不难:

    ProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());

这解决了我上面保存我自己的 vCard 并再次下载的小例子。我在下载其他用户的 vcard 时仍然遇到问题……我会仔细研究一下,也许会为这个问题打开另一个线程。

于 2009-12-10T13:21:55.240 回答
3

您可以使用以下代码获取信息。

VCard card = new VCard();
card.load(connection, "user@fqdn");
System.out.println("Voice: "+card.getPhoneHome("VOICE"));
于 2010-07-04T02:55:16.690 回答
2

尝试先用另一个客户端为该用户设置一个 vCard,然后看看它如何改变你的结果。为了进一步诊断,您需要在 Smack 中打开协议调试(-Dsmack.debugEnabled=true在台式机上使用“”),并在此处发布相关位。

于 2009-12-09T20:12:35.873 回答