3

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 的最佳方法是什么?请给我建议如何解决这个问题。谢谢!

4

1 回答 1

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;
            }
        }
    }
于 2013-12-03T06:52:31.413 回答