2009-12-03 62 views
4

我正在使用Smack库在Android上的XMPP客户端上工作。名册/消息/存在的东西运行得很好。但是,我没有找到一种方法来存储额外的配置文件信息(userpicture,狗的名字,...)。如何使用Smack设置/获取配置文件数据与XMPP

我从Google上看到的唯一方法就是使用VCards。但它根本行不通。我尝试了以下内容:

 VCard vCard = new VCard(); 
     vCard.load(connection); 
     vCard.setEmailHome("[email protected]"); 
     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副本获得相同的结果。顺便说一句,我使用的这个版本啪的:http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/

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

回答

12

我已签出啪的来源,并通过与调试器的重要组成部分去了,以及使用啪调试窗口。问题出在Smack API的VCard实现中。保存一个VCard按照描述工作,但加载被破坏。

parseIQ(XmlPullParser解析器)是PacketReader.java类的一部分,并处理不同类型的封装。它只能处理变量与下面的命名空间:

“胡言乱语:智商:AUTH”, “胡言乱语:IQ:名册”, “胡言乱语:智商:注册”, “金塔:IETF:PARAMS:XML:NS :XMPP协议捆绑”

它也期待,如果有任何注册IQProvider在ProviderManager的。这是我的问题的根源。 VCards没有注册IQProvider。因此,vCard标签内的任何信息都会被丢弃。

这不是太难,虽然注册此IQProvider:

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

这解决了上述救了我自己的名片,并重新下载我的小例子。我仍然无法下载其他用户的电子名片......要仔细研究一下这个问题,也许会为这个问题开辟另一条线索。

+0

嗨@UlrichScheller我可以保存和加载自己的电子名片,但我不能加载其他用户的电子名片。我正在获取功能未实现的响应。有任何想法吗?你有?谢谢 – 2015-06-05 15:41:20

2

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

+0

谢谢,调试模式definitly帮助我跟踪这个问题。 – 2009-12-10 13:23:15

3

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

VCard card = new VCard(); 
card.load(connection, "[email protected]"); 
System.out.println("Voice: "+card.getPhoneHome("VOICE")); 
相关问题