使用 Smack 加载 vCard 信息时出错:"EmptyResultIQ cannot be cast to org.jivesoftware.smackx.vcardtemp.packet.VC



我正在使用stack 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'/>
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'/>

这似乎是服务器实现中的一个错误。XEP-54§3.2明确指出,vcard get的结果必须是

  1. 有效的vcard结果IQ
  2. 错误IQ

如果不存在vCard或用户不存在,则服务器必须返回一个节错误。。。

这里的服务器确实返回了一个空的IQ结果。

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

我实际上在另一个问题中写过这个问题。我希望我在这里转发修复程序不是野蛮人:

您可能面临的问题是JID的后缀。entry.getUser((方法将JID返回为user@example.com/Smack。要获取vCard详细信息,您需要将其查询为user@example.com(没有/Smack(。试试看,让我知道它是否有效。

相关内容

最新更新