asmack - получение пользовательских XML-сообщений || - PullRequest
7 голосов
/ 20 января 2012

Я потратил некоторое время на добавление smack.providers в устройство android, которое прекрасно подхватывает мое приложение. Я добавил 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>
    &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) не вызывается при получении сообщения. Сообщение содержит тег и имеет пространство имен boxer: player, как я указал в smack.providers.

Есть мысли?

1 Ответ

4 голосов
/ 29 января 2012

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

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

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

...