2012-01-19 3 views
7

Я потратил некоторое время, чтобы добавить smack.providers в Android-устройство, которое очень хорошо подхвачено моим приложением. Я добавил iqProviders и extensionProviders по умолчанию, но я также добавил свой обычай extensionProvider, который является следующим:asmack - получение пользовательских XML-сообщений ||

<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="[email protected]" type="chat" id="9" from="[email protected]"> 
    <body> 
    &lt;players xmlns="boxer:players" command="playerlist"&gt; 
     &lt;player&gt;test1&lt;/player&gt; 
     &lt;player&gt;test2&lt;/player&gt; 
    &lt;/players&gt; 
    </body> 
    <thread>3P0i00</thread> 
</message> 

Вопрос теперь в том, почему не является PlayerListProvider (EmbeddedExtensionProvider), вызванным при получении сообщения. Сообщение содержит тег и имеет пространство имен боксера: player, как я указал в smack.providers.

Любые мысли?

+0

как вы решили вашу проблему? вы можете отправить – Hunt

ответ

4

После прочтения о подобных вопросах здесь на SO, я наткнулся на эту question/answer и этот blog post about another way (part 1) (part 2) для реализации пользовательского сообщения отправки/приема.

Считаете ли вы использование PacketExtensionProvider вместо EmbeddedExtensionProvider?

Это объясняется более подробно here, если вы заинтересованы в его использовании вместо EmbeddedExtensionProvider. Возможно, это не совсем то, что вы ищете ... (похоже, для этого требуется больше подхода к ручному анализу), но он может распознать класс PlayerListProvider (через расширение класса PEPEvent.)

+0

Привет. Конечно, я сделал это, а не с помощью .addExtensionProvider, я использовал файлы smack.providers, что практически то же самое, только в формате XML-файла. Так что это не решение проблемы, так как она не решает мою проблему, и я не ближе к решению моей проблемы, и ясно, что вы не приложили много усилий для создания своего ответа. – eleanor

+1

Я отредактировал свое сообщение с другим, возможным ответом. Просто пытаюсь помочь ... так как никто еще не задумался об этом. :) – summea