Xmpp 使用Smack加载vCard信息时出错:“0”;EmptyResultIQ不能强制转换为org.jivesoftware.smackx.vcardtemp.packet.VCard“;

Xmpp 使用Smack加载vCard信息时出错:“0”;EmptyResultIQ不能强制转换为org.jivesoftware.smackx.vcardtemp.packet.VCard“;,xmpp,ejabberd,smack,vcf-vcard,Xmpp,Ejabberd,Smack,Vcf Vcard,我正在使用smack 4.1.1创建一个android聊天应用程序 我可以在本地测试服务器(Openfire)上加载用户vcard 但现在,在ejabberd服务器上,当我尝试加载vcard时,出现以下错误: 07-19 11:11:26.175: E/AndroidRuntime(13849): java.lang.RuntimeException: An error occured while executing doInBackground() 07-19 11:11:26.175: E/

我正在使用smack 4.1.1创建一个android聊天应用程序

我可以在本地测试服务器(Openfire)上加载用户vcard

但现在,在ejabberd服务器上,当我尝试加载vcard时,出现以下错误:

07-19 11:11:26.175: E/AndroidRuntime(13849): java.lang.RuntimeException: An error occured while executing doInBackground()
07-19 11:11:26.175: E/AndroidRuntime(13849):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at java.lang.Thread.run(Thread.java:818)
07-19 11:11:26.175: E/AndroidRuntime(13849): Caused by: java.lang.ClassCastException: org.jivesoftware.smack.packet.EmptyResultIQ cannot be cast to org.jivesoftware.smackx.vcardtemp.packet.VCard
07-19 11:11:26.175: E/AndroidRuntime(13849):    at org.jivesoftware.smackx.vcardtemp.VCardManager.loadVCard(VCardManager.java:125)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at service.ChatService$Connect.doInBackground(ChatService.java:331)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at service.ChatService$Connect.doInBackground(ChatService.java:1)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
07-19 11:11:26.175: E/AndroidRuntime(13849):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
这一行:

org.jivesoftware.smack.packet.EmptyResultIQ cannot be cast to org.jivesoftware.smackx.vcardtemp.packet.VCard
这是我获得vcard的方式:

VCard info;
    for (RosterEntry entry : entries) {
        Presence entryPresence = roster.getPresence(entry.getUser());
        Presence.Type type = entryPresence.getType();
        Log.d(entry.getUser(), "bar jid");
        if(entry.getUser().lastIndexOf("@") == -1)
            continue;
        String username = entry.getUser().substring(0,
                entry.getUser().lastIndexOf("@"));      
        try {
            info = VCardManager.getInstanceFor(connection).loadVCard(entry.getUser());
            if(info.getMiddleName() != null)
            {

                uh.updateAvatar(username, info.getMiddleName());
            }
        } catch (NoResponseException | XMPPErrorException
                | NotConnectedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        }
    }
logcat提到这一行是问题的根源:

        info = VCardManager.getInstanceFor(connection).loadVCard(entry.getUser());
这就是我在坠机前得到的信息:

07-19 12:38:06.030: D/SMACK(16307): SENT (0): <stream:stream xmlns='jabber:client' to='myserver.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'>
07-19 12:38:06.665: D/SMACK(16307): RECV (0): <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='184908447' from='myserver.com' version='1.0' xml:lang='en'><stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><compression xmlns='http://jabber.org/features/compress'><method>zlib</method></compression><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism><mechanism>SCRAM-SHA-1</mechanism></mechanisms><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='wwrSvLFOLzC92POh074kJuEqYxE='/><register xmlns='http://jabber.org/features/iq-register'/></stream:features>
07-19 12:38:06.665: D/SMACK(16307): SENT (0): <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AG1laGRpMTIzADEyMzQ=</auth>
07-19 12:38:07.390: D/SMACK(16307): RECV (0): <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
07-19 12:38:07.390: D/SMACK(16307): SENT (0): <stream:stream xmlns='jabber:client' to='myserver.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' id='184908447' xml:lang='en'>
07-19 12:38:08.005: D/SMACK(16307): RECV (0): <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='1619836774' from='myserver.com' version='1.0' xml:lang='en'><stream:features><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='wwrSvLFOLzC92POh074kJuEqYxE='/><register xmlns='http://jabber.org/features/iq-register'/></stream:features>
07-19 12:38:08.005: D/SMACK(16307): SENT (0): <iq id='VSflA-4' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>roo</resource></bind></iq>
07-19 12:38:08.725: D/SMACK(16307): RECV (0): <iq id='VSflA-4' type='result'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>mehdi123@myserver.com/roo</jid></bind></iq>
07-19 12:38:08.725: D/SMACK(16307): SENT (0): <iq id='VSflA-6' type='set'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>
07-19 12:38:09.245: D/SMACK(16307): RECV (0): <iq type='result' id='VSflA-6'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>
07-19 12:38:09.245: D/SMACK(16307): User logged (0): mehdi123@myserver.com:5222/roo
07-19 12:38:09.245: D/received from authenticated service(16307): connected: true
07-19 12:38:09.245: D/SMACK(16307): SENT (0): <iq id='VSflA-8' type='get'><query xmlns='jabber:iq:roster'></query></iq>
07-19 12:38:09.245: D/SMACK(16307): SENT (0): <iq id='VSflA-9' type='get'><vCard xmlns='vcard-temp'/></iq>
07-19 12:38:09.860: D/SMACK(16307): RECV (0): <iq from='mehdi123@myserver.com' to='mehdi123@myserver.com/roo' id='VSflA-9' type='result'><vCard xmlns='vcard-temp'><N><FAMILY/><GIVEN>gigi</GIVEN><MIDDLE>http://31.170.166.15/avatars/mehdi123.jpg</MIDDLE></N><FN>gigi http://31.170.166.15/avatars/mehdi123.jpg </FN><NICKNAME>gigi </NICKNAME><EMAIL><HOME/><INTERNET/><PREF/><USERID>iyi</USERID></EMAIL><TEL><HOME/><CELL/><NUMBER>hfu</NUMBER></TEL><ADR><HOME/><CTRY/><LOCALITY/><REGION/></ADR></vCard></iq><iq from='mehdi123@myserver.com' to='mehdi123@myserver.com/roo' id='VSflA-8' type='result'><query xmlns='jabber:iq:roster'><item subscription='from' jid='jafar123@myserver.com'/></query></iq>
07-19 12:38:09.860: D/http://31.170.166.15/avatars/mehdi123.jpg(16307): http://31.170.166.15/avatars/mehdi123.jpg from chatservice
07-19 12:38:09.865: D/SMACK(16307): XMPPConnection authenticated (0)
07-19 12:38:09.865: I/XMPPChatDemoActivity(16307): connected & logged in
07-19 12:38:09.865: D/SMACK(16307): SENT (0): <presence id='VSflA-12'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/></presence>
07-19 12:38:09.875: D/SMACK(16307): SENT (0): <presence to='iran@conference.myserver.com/mehdi123' id='VSflA-13'><x xmlns='http://jabber.org/protocol/muc'><password></password><history maxstanzas='0'/></x><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/></presence>
07-19 12:38:10.575: D/SMACK(16307): RECV (0): <presence from='mehdi123@myserver.com/roo' to='mehdi123@myserver.com/roo' xml:lang='en' id='VSflA-12'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/></presence>
07-19 12:38:11.310: D/SMACK(16307): RECV (0): <message from='iran@conference.myserver.com' to='mehdi123@myserver.com/roo' type='groupchat'><body>This room is not anonymous</body><x xmlns='http://jabber.org/protocol/muc#user'><status code='100'/></x></message><message from='iran@conference.myserver.com' to='mehdi123@myserver.com/roo' type='groupchat'><body>This room is filtered by external service</body><x xmlns='http://jabber.org/protocol/muc#user'><status code='100'/></x></message><presence from='iran@conference.myserver.com/boy' to='mehdi123@myserver.com/roo' xml:lang='En' ver='2.3.1'><show>dnd</show><status>iN niZ BoGZaRaD ツ</status><c xmlns='http://jabber.org/protocol/caps' node='http://kopete.kde.org/jabber/capshttp://kopete.kde.org/jabber/caps' ver='xzah7XZzG6oCHvM2nNnG2hHNOBM=' hash='sha-1'/><x xmlns='http://jabber.org/protocol/muc#user'><item jid='boy@myserver.com/SaM' affiliation='member' role='participant'/></x></presence><presence from='iran@conference.myserver.com/jafar123' to='mehdi123@myserver.com/roo' id='BYLNs-85'><x xmlns='http://jabber.org/protocol/muc#user'><item jid='jafar123@myserver.com/Spark 2.6.3' affiliation='admin' role='moderator'/></x></presence>
07-19 12:38:11.895: D/SMACK(16307): RECV (0): <presence from='iran@conference.myserver.com/mehdi123' to='mehdi123@myserver.com/roo' xml:lang='en' id='VSflA-13'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/><x xmlns='http://jabber.org/protocol/muc#user'><item jid='mehdi123@myserver.com/roo' affiliation='admin' role='moderator'/><status code='110'/><status code='100'/></x></presence><message from='iran@conference.myserver.com' to='mehdi123@myserver.com/roo' type='groupchat'><subject>be dalile barkhi masael va tamirat server named off mishe ta zamani ke barname  android kamel nashe on nemikonam ,  momkene yemah domah ya chand mah zaman bebare</subject><body>mahan has set the subject to: be dalile barkhi masael va tamirat server named off mishe ta zamani ke barname  android kamel nashe on nemikonam ,  momkene yemah domah ya chand mah zaman bebare</body></message>
07-19 12:38:11.895: D/SMACK(16307): SENT (0): <presence to='321@conference.myserver.com/mehdi123' id='VSflA-21'><x xmlns='http://jabber.org/protocol/muc'><password></password><history maxstanzas='0'/></x><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/></presence>
07-19 12:38:14.790: D/SMACK(16307): RECV (0): <presence from='321@conference.myserver.com/mehdi123' to='mehdi123@myserver.com/roo' xml:lang='en' id='VSflA-21'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/><x xmlns='http://jabber.org/protocol/muc#user'><item jid='mehdi123@myserver.com/roo' affiliation='owner' role='moderator'/><status code='110'/><status code='201'/></x></presence>
07-19 12:38:14.790: D/jafar123@myserver.com(16307): bar jid
07-19 12:38:14.790: D/SMACK(16307): SENT (0): <presence id='VSflA-23'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/></presence>
07-19 12:38:14.795: D/SMACK(16307): SENT (0): <iq to='jafar123@myserver.com' id='VSflA-26' type='get'><vCard xmlns='vcard-temp'/></iq>
07-19 12:38:15.435: D/SMACK(16307): RECV (0): <presence from='mehdi123@myserver.com/roo' to='mehdi123@myserver.com/roo' xml:lang='en' id='VSflA-23'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='os2Kusj3WEOivn5n4iFr/ZEO8ls='/></presence>
07-19 12:38:16.040: D/SMACK(16307): RECV (0): <iq from='jafar123@myserver.com' to='mehdi123@myserver.com/roo' id='VSflA-26' type='result'/>
07-19 12:38:06.030:D/SMACK(16307):发送(0):
7-19 12:38:06.665:D/SMACK(16307):RECV(0):ZLIB-MD5紧急停堆-SHA-1
7-19 12:38:06.665:D/SMACK(16307):发送(0):AG1laGRpMTIzADEyMzQ=
7-19 12:38:07.390:D/SMACK(16307):RECV(0):
07-19 12:38:07.390:D/SMACK(16307):已发送(0):
07-19 12:38:08.005:D/SMACK(16307):RECV(0):
07-19 12:38:08.005:D/SMACK(16307):发送(0):roo
7-19 12:38:08.725:D/SMACK(16307):RECV(0):mehdi123@myserver.com/袋鼠
7-19 12:38:08.725:D/SMACK(16307):已发送(0):
7-19 12:38:09.245:D/SMACK(16307):RECV(0):
07-19 12:38:09.245:D/SMACK(16307):用户登录(0):mehdi123@myserver.com:5222/roo
07-19 12:38:09.245:D/从认证服务(16307)接收:已连接:真
7-19 12:38:09.245:D/SMACK(16307):发送(0):
7-19 12:38:09.245:D/SMACK(16307):发送(0):
7-19 12:38:09.860:D/SMACK(16307):RECV(0):gigihttp://31.170.166.15/avatars/mehdi123.jpggigi http://31.170.166.15/avatars/mehdi123.jpg 吉吉伊夫
07-19 12:38:09.860:D/http://31.170.166.15/avatars/mehdi123.jpg(16307): http://31.170.166.15/avatars/mehdi123.jpg 来自聊天室
07-19 12:38:09.865:D/SMACK(16307):XMPPConnection已验证(0)
07-19 12:38:09.865:I/XMPPChatDemoActivity(16307):已连接并已登录
7-19 12:38:09.865:D/SMACK(16307):已发送(0):
07-19 12:38:09.875:D/SMACK(16307):已发送(0):
7-19 12:38:10.575:D/SMACK(16307):RECV(0):
7-19 12:38:11.310:D/SMACK(16307):RECV(0):此房间不匿名此房间由niZ BoGZaRaD的外部服务进行过滤ツ
7-19 12:38:11.895:D/SMACK(16307):RECV(0):Dalie barkhi masael va tamirat服务器命名为mishe ta zamani ke barname android kamel nashe在nemikonam,momkene yemah domah ya chand mah zaman bebaremahan将主题设定为:Dalie barkhi masael va tamirat服务器在nemikonam的mishe ta zamani ke barname android kamel nashe命名,momkene yemah domah ya chand mah zaman bebare
07-19 12:38:11.895:D/SMACK(16307):发送(0):
7-19 12:38:14.790:D/SMACK(16307):RECV(0):
07-19 12:38:14.790:D/jafar123@myserver.com(16307):巴吉德
7-19 12:38:14.790:D/SMACK(16307):发送(0):
7-19 12:38:14.795:D/SMACK(16307):已发送(0):
7-19 12:38:15.435:D/SMACK(16307):RECV(0):
7-19 12:38:16.040:D/SMACK(16307):RECV(0):

我实际上在另一个问题中写到了这个问题。我希望我不是一个野蛮人,在这里重新发布修复程序:

您可能面临的问题是JID的后缀。getUser()方法将JID返回为user@example.com/啪。要获取vCard详细信息,您需要按以下方式查询它:user@example.com(没有打耳光)。尝试一下,并告诉我它是否有效。

发送:
SENT: <iq to='jafar123@myserver.com' id='VSflA-26' type='get'><vCard xmlns='vcard-temp'/></iq>
RECV: <iq from='jafar123@myserver.com' to='mehdi123@myserver.com/roo' id='VSflA-26' type='result'/>
记录:
这似乎是服务器实现中的一个bug。XEP-54§3.2明确指出,vcard get的结果必须为

  • 有效的vcard结果
  • 错误智商
  • 如果不存在vCard或用户不存在,服务器必须返回 一节错误

    这里的服务器返回一个空的IQ结果


    我建议将此情况报告给服务器开发人员。

    跟踪将有助于诊断问题。请看,我在崩溃之前放置了smack调试。当它关闭时,一切正常。但是为什么?我不认为TLS是相关的。你可能推断出不存在的因果关系。是的,我已经读过了,老实说,这是正确的答案!我与服务器所有者交谈,问他是否以某种方式禁用了获取vcard,他说:我不确定,但我认为服务器上的某些安全措施阻止普通用户获取vcard。他还说,出于安全原因,我们需要有这样一个东西,因为有些人在滥用……说得好,尤达,说得好。但那不是我的问题。我会记住你的解决方案,因为它可能在将来的某个地方发生:D