7

Android デバイスに smack.providers を追加するのに時間を費やしましたが、これは私のアプリケーションによって問題なく検出されます。デフォルトの iqProvider と extensionProvider を追加しましたが、カスタムの 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) が呼び出されないのはなぜですか。メッセージにはタグが含まれており、smack.providers で指定したように、boxer:player の名前空間があります。

何かご意見は?

4

1 に答える 1

4

SOで同様の問題について読んだ後、カスタムメッセージの送受信を実装する別の方法(パート1)(パート2 )についてのこの質問/回答とこのブログ投稿に出くわしました。

EmbeddedExtensionProviderの代わりにPacketExtensionProviderを使用することを検討しましたか?

の代わりに試してみたい場合は、ここで詳しく説明しますEmbeddedExtensionProvider。それはあなたが探しているものと正確に一致しないかもしれません...(それはより手動の解析アプローチを必要とするように見えます)が、それはあなたのPlayerListProviderクラスを認識させるかもしれません(PEPEventクラスを拡張することによって)。

于 2012-01-29T02:49:15.420 に答える