XMPP Smack 4.1.1 UnsupportedIQ 错误

Posted

技术标签:

【中文标题】XMPP Smack 4.1.1 UnsupportedIQ 错误【英文标题】:XMPP Smack 4.1.1 UnsupportedIQ error 【发布时间】:2015-06-01 21:56:39 【问题描述】:

我正在使用 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();

【问题讨论】:

【参考方案1】:

UnsupportedOperationException 从类 UnparsedIQ 抛出时 “由于未找到提供程序而无法解析的 IQ 节。”

Pls refer this

我猜,在您的情况下,找不到“urn:tmp:token”的提供者。

【讨论】:

这也是igniterealtime.org/builds/smack/docs/latest/documentation/…【参考方案2】:

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

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

【讨论】:

以上是关于XMPP Smack 4.1.1 UnsupportedIQ 错误的主要内容,如果未能解决你的问题,请参考以下文章

Xmpp 连接因 smack 失败

收到消息时通知 XMPP + Smack

android中的XMPP连接使用smack

XMPP 服务器不响应 Smack 登录请求

XMPP Smack - 消息被修改

Smack XMPP 连接未通过 4G 网络连接