XMPP Smack 4.1.1 UnsupportedIQ 错误

XMPP Smack 4.1.1 UnsupportedIQ error

我正在使用 XMPP(smack 4.1.1) 制作 android 聊天应用程序。 这是我使用的节数据包侦听器。

但是当我使用这个侦听器时出现 UnsupportedIQ 错误。 我的错是什么?

connection.addAsyncStanzaListener(new StanzaListener() {
    @Override
    public void processPacket(Stanza p) throws SmackException.NotConnectedException {

         if (p.getStanzaId().equals(getTokenId)) {
            IQ iq = (IQ) p;
            if (iq != null && iq.getType().equals(IQ.Type.result)) {

                // here, I want to get xxxxxx value from <value xmlns='jabber:client'>xxxxxxx</value>

            }
         }
    }, new StanzaFilter() {
    @Override
    public boolean accept(Stanza stanza) {
         return true;
    }
});

IQ tokenIQ = new IQ("query", "urn:tmp:token") {
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
     xml.rightAngleBracket();
     return xml;
   }
};

getTokenId = tokenIQ.getStanzaId();
try {
    connection.sendStanza(tokenIQ);
} catch (SmackException.NotConnectedException e) {
    e.printStackTrace();
}

UnsupportedOperationException 从 Class UnparsedIQ 抛出,当 "An IQ stanzas that could not be parsed because no provider was found."

Pls refer this

我想,在你的情况下,找不到 "urn:tmp:token" 的提供商。

我解决了这个问题。 这是我的代码。

class TokenIQ extends IQ {
    String token;

    protected TokenIQ(String childElementName) {
        super(childElementName);
    }

    public String getToken() {
        return token;
    }

    @Override
    protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
        return xml;
    }
}

class TokenProvider extends IQProvider
{
    @Override
    public Element parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, SmackException {

        TokenIQ tokenIQ = new TokenIQ("value");
        int eventType = parser.next();
        tokenIQ.token = parser.getText();

        return tokenIQ;
    }
}

ProviderManager.addIQProvider("value", "jabber:client", new TokenProvider());

//调用部分

//"<query xmlns='urn:tmp:token'/>"
IQ tokenIQ = new IQ("query", "urn:tmp:token") {

    @Override
    protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
            xml.rightAngleBracket();
            return xml;
    }
};

getTokenId = tokenIQ.getStanzaId();
try {
    mConnection.sendStanza(tokenIQ);
} catch (SmackException.NotConnectedException e) {
    e.printStackTrace();
}

//接收部分

mConnection.addAsyncStanzaListener(new StanzaListener() {
    @Override
    public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
        if (packet.getStanzaId() != null && packet.getStanzaId().equals(getTokenId)) {

            TokenIQ iq = (TokenIQ)packet;
            tokenId = iq.getToken();    
        }       
    }
}, new StanzaFilter() {
    @Override
    public boolean accept(Stanza stanza) {
        return true;
    }
});