如何使用Smack使用XMPP设置/获取配置文件数据

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

我从谷歌搜索看到的唯一方法是使用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()); 

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

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

我已经检查了Smack的来源,并使用调试器以及使用Smack调试窗口浏览了重要部分。 问题出在Smack API的VCard实现中。 保存VCard确实如所描述的那样工作,但加载被破坏。

parseIQ(XmlPullParser解析器)是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并再次下载。 我仍然无法下载其他用户的vcards …要仔细研究这个并且可能为这个问题打开另一个线程。

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

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

尝试先为其他客户端设置该用户的vCard,然后查看更改结果的方式。 为了进一步诊断,您需要在Smack中打开协议调试(在桌面计算机上使用“ -Dsmack.debugEnabled=true ”),并在此处发布相关位。