Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Smack通过XMPP设置/获取配置文件数据_Java_Android_Xmpp_Smack - Fatal编程技术网

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

Java 如何使用Smack通过XMPP设置/获取配置文件数据,java,android,xmpp,smack,Java,Android,Xmpp,Smack,我正在Android上使用Smack库开发XMPP客户端。花名册/信息/状态信息运行得非常好。然而,我没有找到一种方法来存储额外的个人资料信息(userpicture,狗的名字,…) 我从谷歌上看到的唯一方法就是使用vCard。但它根本不起作用。我尝试了以下方法: VCard vCard = new VCard(); vCard.load(connection); vCard.setEmailHome("meine_home@email.de");

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

我从谷歌上看到的唯一方法就是使用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中,也没有出现在该系统中。输出:

        vCard.load(connection, user);
        System.out.println(user + " has this vCard: " + vCard.toXML());
所以一切都出了问题,但没有迹象表明是什么。我用google talk服务器和我自己的openfire副本尝试了这个方法,得到了相同的结果。顺便说一句,我正在使用这个版本的Smack:


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

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

我已经检查了Smack的源代码,并使用调试器检查了重要部分,还使用了Smack调试窗口。问题出在的VCard实现内部。保存VCard的工作方式如前所述,但加载中断

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

“jabber:iq:auth”, “叽叽喳喳:智商:花名册”, “jabber:iq:register”, “urn:ietf:params:xml:ns:xmpp绑定”

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

不过,注册此IQProvider并不太难:

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

这解决了我上面保存自己的vCard并再次下载的小例子。我仍然在下载其他用户的vCard时遇到问题。。。我们将对此进行更深入的研究,并可能为该问题打开另一个线程。

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

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

谢谢,调试模式确实帮助我跟踪了这个问题。嗨@UlrichScheller我可以保存并加载我自己的vCard,但我不能加载其他用户的vCard。我收到了未实现的功能响应。有什么想法吗?你有吗?谢谢