我花了一些时间在
Android设备中添加smack.providers,我的应用程序很好地接收了它.我添加了默认的iqProviders和extensionProviders,但我还添加了我的自定义extensionProvider,它是以下内容:
<extensionProvider> <elementName>players</elementName> <namespace>Boxer:players</namespace> <className>company.games.Boxer.PlayerListProvider</className> </extensionProvider>
我还要介绍一下PlayerListProvider类,它目前只是为了看它是否会被调用(它不会被调用) – 当我知道它被调用时我将完全实现它,因此至少是功能的一部分作品:
import java.util.List; import java.util.Map; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smackx.provider.EmbeddedExtensionProvider; import android.util.Log; @SuppressWarnings("deprecation") class PlayerListProvider extends EmbeddedExtensionProvider { protected PacketExtension createReturnExtension(String currentElement,String currentNamespace,Map<String,String> attributeMap,List<? extends PacketExtension> content) { Log.w("***** AAAAAAAAAAAAAAAAAAAA *******","0"); return new XMLPlayerList(); } } class XMLPlayerList implements PacketExtension { public String getElementName() { return "aaaaa"; } public String getNamespace() { return "aaaaa"; } public String toXML() { return "aaaaa"; } }
当我运行客户端Android应用程序时,我收到以下消息:
<message to="eee@localhost" type="chat" id="9" from="admin@localhost"> <body> <players xmlns="Boxer:players" command="playerlist"> <player>test1</player> <player>test2</player> </players> </body> <thread>3P0i00</thread> </message>
我现在的问题是,为什么在收到消息时没有调用PlayerListProvider(EmbeddedExtensionProvider).该消息包含标记,并具有Boxer:player的命名空间,正如我在smack.providers中指定的那样.
有什么想法吗?
解决方法
在SO上阅读了类似问题之后,我遇到了
question/answer和
blog post about another way(
part 1)(
part 2)来实现自定义消息发送/接收.
您是否考虑过使用PacketExtensionProvider代替EmbeddedExtensionProvider?
如果您有兴趣试用它来代替EmbeddedExtensionProvider,可以在here中更详细地解释它.它可能不是您正在寻找的……(看起来它需要更多的手动解析方法),但它可能会识别您的PlayerListProvider类(通过扩展PEPEvent类.)