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