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

Error loading vCard information using Smack: "EmptyResultIQ cannot be cast to org.jivesoftware.smackx.vcardtemp.packet.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/AndroidRuntime(13849):    at android.os.AsyncTask.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.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.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'/>

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

您可能面临的问题是 JID 的后缀。 entry.getUser() 方法 returns JID 为 user@example.com/Smack。要获取 vCard 详细信息,您需要以 user@example.com(不带 /Smack)的身份进行查询。试试看,如果有效请告诉我。

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. 智商失误

If no vCard exists or the user does not exist, the server MUST return a stanza error...

这里的服务器return一个空的IQ结果。

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