我正在 Android 上使用 Smack 库开发 XMPP 客户端。花名册/消息/状态等内容运行得很好。然而,我没有找到一种方法来存储额外的个人资料信息(用户图片、狗的名字……)。

我从谷歌搜索中看到的唯一方法是使用 VCard。但这根本行不通。我尝试了以下方法:

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

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

我在这里做错了什么?使用 Smack 存储个人资料相关信息的正确方法是什么?

有帮助吗?

解决方案

我已经检查了 Smack 的源代码,并使用调试器以及使用 Smack 调试窗口浏览了重要部分。问题出在 VCard 实现内部 斯马克API. 。保存 VCard 确实可以按描述工作,但加载已损坏。

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

“ jabber:iq:auth”,“ jabber:iq:花名册”,“ jabber:iq:nocess”,“ urn:ietf:params:xml:xml:ns:ns:xmpp bind''

它还会查找 ProviderManager 中是否有已注册的 IQProvider。这就是我的问题的根源。没有注册 VCard 的 IQProvider。因此,vCard 标签内的任何信息都会被删除。

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

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

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

其他提示

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

VCard card = new VCard();
card.load(connection, "user@fqdn");
System.out.println("Voice: "+card.getPhoneHome("VOICE"));

先尝试设置电子名片与其他客户端的用户,并了解如何改变你的结果。为了进一步确诊,就需要在这里打开协议调试中的Smack(台式机上使用“-Dsmack.debugEnabled=true”),并张贴相关位。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top