1

3 つのクライアントのプレゼンスを更新しようとしています。そのうちの 2 つは Adium & Pidgin で、もう 1 つはカスタム ビルド アプリです。アプリからプレゼンスを送信すると、使用可能に設定され、ステータスが「室内」に設定されます。

 ConnectionConfiguration connConfig =
            new ConnectionConfiguration(host, Integer.parseInt(port), service);
   connection = new XMPPConnection(connConfig);
   presence = new Presence(Presence.Type.available,"In Room",1,Presence.Mode.available);

        connection.sendPacket(presence);

しかし、Adium などの他の IM からプレゼンスを更新すると、APP からプレゼンスを更新したときにプレゼンスとステータスの更新に失敗します。それ以外の場合、Adium と Pidgin は互いに連携します。アプリが原因で問題が発生していることに気付きました。プレゼンス パケット リスナーを実装しました。Pidgin または Adium からプレゼンスを変更した場合、このリスナーはリッスンしています。リッスンする必要があります。

connection.addPacketListener(new PacketListener(){

        @Override
        public void processPacket(Packet presencePkt) {

            Presence pres= ((Presence) presencePkt);
            presence.setPriority(1);// presence is global variable 

        switch(pres.getMode()){
            case available: presence.setMode(pres.getMode());
                            //connection.sendPacket(pres);
            break;
            case dnd: presence.setMode(pres.getMode());
                     //connection.sendPacket(pres);
            break;

            default :
                break;

        }


    }

}, new PacketTypeFilter(Presence.class));
4

2 に答える 2

0

フローへのコメントを読みました。この回答は遅れていますが、他の人も同じことを必要とするかもしれません。

答えはRosterListener、Flowが提案したようにaを使用することです(Smackを使用した私の経験に基づいています)。

RosterListener を使用すると、自分のユーザーと他のユーザーのプレゼンスの変更を受け取ります (to と from はどちらも自分のユーザー名になります)。これは、名簿があなたのために追跡していることを意味するので、Roster#getPresences(username)メソッドを使用して、さまざまなソースからあなたのプレゼンスの順序付きリストを取得できます.Roster#getUser()

ドキュメントhereはトピックをカバーし、基本的に異なるモードには異なる優先順位があることを説明しているため、(たとえば)クライアントが「使用可能」である場合、(Roster#getPresence(username)単数) を使用すると使用可能が返されます。

名簿では、必要に応じて、これらの優先度/順序を設定/変更することもできます。これが誰かに役立つことを願っています!

于 2014-03-05T17:01:19.880 に答える
0

カスタムを採用することPresencePacketListenerは、98% 間違ったアプローチです。RosterListener代わりに、独自のを追加Roster.addRosterListener()して、名簿内のエンティティのプレゼンスの変更に対応する必要があります。

サーバがプレゼンス スタンザをクライアントに転送するように、両方の jabber エンティティに少なくともからのサブスクリプション モードまたは両方があることを確認してください。

アカウントの他のリソース/完全な JID のプレゼンスを取得する場合。試すRoster.getPresences(StringUtils.parseBareAddress(connection.getUser()))

于 2013-02-13T18:06:55.287 に答える