Search code examples
androidxmppchatsmack

XMPP Smack 4.1.1 UnsupportedIQ error


I am making android chat app using XMPP(smack 4.1.1). Here is stanza packet listener I used.

But I got UnsupportedIQ error when I used this listener. What is my wrong?

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();
}

Solution

  • I solved this problem. Here is my code.

    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());
    

    //Call part

    //"<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();
    }
    

    //Receiving part

    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;
        }
    });