2012-01-19 11 views
7

Spędziłem trochę czasu, aby dodać smack.providers na urządzeniu z Androidem, które jest odbierane przez moją aplikację. Dodałem iqProviders domyślne i extensionProviders, ale Dodałem także mój zwyczaj extensionProvider, który przedstawia się następująco:asmack - odbieranie niestandardowych wiadomości XML ||

<extensionProvider> 
    <elementName>players</elementName> 
    <namespace>boxer:players</namespace> 
    <className>company.games.boxer.PlayerListProvider</className> 
</extensionProvider> 

Pozwól mi również wprowadzić klasę PlayerListProvider, który jest obecnie nie tylko zobaczyć, czy to będzie sprawdzony (które nie) - będę go realizować w pełni, kiedy będę wiedział, że jest wywoływana, więc przynajmniej część funkcji działa:

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"; 
    } 

} 

A ja otrzymuję następujący komunikat, gdy Uruchamiam aplikację na Androida dla klienta:

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

Moje pytanie brzmi teraz, dlaczego nie jest wywołany PlayerListProvider (EmbeddedExtensionProvider) po otrzymaniu wiadomości. Wiadomość zawiera tag i ma przestrzeń nazw boksera: player, tak jak to określiłem w smack.providers.

Jakieś myśli?

+0

W jaki sposób rozwiązałeś swój problem? możesz podzielić się – Hunt

Odpowiedz

4

Po przeczytaniu o podobnych problemach tutaj na SO, natknąłem się na ten question/answer i tym blog post about another way (part 1) (part 2) wdrożyć niestandardowy komunikat wysyłania/odbierania.

Czy rozważałeś użycie PacketExtensionProvider zamiast EmbeddedExtensionProvider?

Zostało to wyjaśnione bardziej szczegółowo here, jeśli jesteś zainteresowany wypróbowaniem go w miejscu EmbeddedExtensionProvider. Być może nie jest to dokładnie to, czego szukasz ... (wygląda na to, że wymaga to ręcznego parsowania), ale może zostać rozpoznana klasa PlayerListProvider (przez rozszerzenie klasy PEPEvent).

+0

Witam. Oczywiście zrobiłem to, a nie przez .addExtensionProvider, użyłem plików smack.providers, które robią praktycznie to samo, tylko w formacie pliku XML. To nie jest rozwiązanie problemu, ponieważ nie rozwiązuje on mojego problemu, ani nie jestem bliższy rozwiązania mojego problemu i wyraźnie nie wkładałeś dużo wysiłku w przygotowanie odpowiedzi. – eleanor

+1

Edytowałem swój wpis z inną, możliwą odpowiedzią. Próbuję ci pomóc ... ponieważ nikt jeszcze nie napisał o tym. :) – summea

Powiązane problemy