将自定义IQProvider添加到Asmack时无法接收新创建的聊天

时间:2013-07-30 05:50:47

标签: android xmpp asmack

我正在使用asmack-android-17-0.8.3为我的android项目。

我已将asmack源复制到我的项目中,并且还在ConfigureProviderManager类中添加了我的自定义IQ提供程序,如下所示:

other extensions and IQ providers...

// XEP-184 Message Delivery Receipts
    pm.addExtensionProvider("received", "urn:xmpp:receipts", new DeliveryReceipt.Provider());
    pm.addExtensionProvider("request", "urn:xmpp:receipts", new DeliveryReceipt.Provider());

    // XEP-0115 Entity Capabilities
    pm.addExtensionProvider("c", "http://jabber.org/protocol/caps", new CapsExtensionProvider());

    // XEP-0136
    pm.addIQProvider("list", "urn:xmpp:archive", new ListIQProvider());

正如您所看到的,在最底线,我添加了IQProvider以支持在XEP-0136中存档!

现在,当我添加此内容时,我可以将存档的聊天数据提供给我的iq提供商,但不幸的是,同时它也使我的客户端无法通过ChatManager接收新的聊天记录!

这仍然是asmack中的错误吗?添加我的自定义iqprovider的最佳方法是什么? 请给我建议如何解决这个问题。谢谢!

1 个答案:

答案 0 :(得分:1)

你是否从文档中看到这句话“解析IQ子文档并创建一个IQ实例。每个IQ必须有一个子元素。在方法调用开始时,xml解析器将位于IQ子元素的开始标记处。 在方法调用结束时,解析器必须定位在子元素的结束标记上。“?

也许您应该编写代码,如smack内置提供程序MUCAdminProvider:

boolean done = false;
while (!done) {
        int eventType = parser.next();
        if (eventType == XmlPullParser.START_TAG) {
            if (parser.getName().equals("actor")) {
                item.setActor(parser.getAttributeValue("", "jid"));
            }
            if (parser.getName().equals("reason")) {
                item.setReason(parser.nextText());
            }
        }
        else if (eventType == XmlPullParser.END_TAG) {
            if (parser.getName().equals("item")) {
                done = true;
            }
        }
    }