我正在 Android 上使用 Smack 库开发 XMPP 客户端。花名册/消息/状态等内容运行得很好。然而,我没有找到一种方法来存储额外的个人资料信息(用户图片、狗的名字……)。
我从谷歌搜索中看到的唯一方法是使用 VCard。但它根本不起作用。我尝试了以下方法:
VCard vCard = new VCard();
vCard.load(connection);
vCard.setEmailHome("[email protected] /cdn-cgi/l/email-protection");
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/ http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/
我在这里做错了什么?使用 Smack 存储个人资料相关信息的正确方法是什么?
我已经检查了 Smack 的源代码,并使用调试器以及使用 Smack 调试窗口浏览了重要部分。问题出在 VCard 实现内部斯马克API http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/packet/VCard.html。保存 VCard 确实可以按描述工作,但加载已损坏。
parseIQ(XmlPullParser parser) 是 PacketReader.java 类的一部分,处理不同类型的包。它仅处理具有以下命名空间的标签:
“闲聊:智商:身份验证”,
"jabber:智商:名册",
"jabber:iq:注册",
“瓮:ietf:参数:xml:ns:xmpp-bind”
它还会查找 ProviderManager 中是否有已注册的 IQProvider。这就是我的问题的根源。没有注册 VCard 的 IQProvider。因此,vCard 标签内的任何信息都会被删除。
不过注册这个 IQProvider 并不太难:
ProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());
这解决了我上面保存我自己的 vCard 并再次下载的小例子。我在下载其他用户电子名片时仍然遇到问题...要仔细研究一下这个问题,也许会为该问题打开另一个线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)