如何使用 Smack 通过 XMPP 设置/获取配置文件数据
题
我正在 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
”),并张贴相关位。