2009-08-26 12 views
5

Smack APIを使用してGoogleトーククライアントを作成しています。今私はこれのためにリクエストを追加する必要があります。 サブスクリプションモードを手動&に設定しました。現在、プレゼンスパケット用のリスナーを登録する必要がありますが、どのようにすればよいのですか。 どの身体の助けもできますか?smack APIでリクエストを追加する方法

答えて

9

まだ試したことはありませんが、以下のように動作するはずです。手動モードを使用する場合は、タイプがPresence.Type.subscribeのプレゼンスパケットをリッスンするPacketListenerを登録する必要があります。

まず名簿を設定します。

Roster roster = connection.getRoster(); 
    roster.setSubscriptionMode(Roster.SubscriptionMode.manual); 

は、次に上記の接続、例えばにパケットのリスナーを追加します。

connection.addPacketListener(new SubscriptionListener(), new PacketFilter(){ 

       public boolean accept(Packet packet) { 
        if(packet instanceof Presence) 
         if(((Presence)packet).getType().equals(Presence.Type.subscribe)) 
          return true; 
        return false; 
       }}); 

上記のコードは、ちょうどすべての要求に対してtrueを返す、しかし、あなたはそれをカスタマイズすることができますすなわち、ユーザーのGUI入力に基づいて真または偽に設定します。

+0

クラスSubscriptionListenerが見つからないため、私は投票しました。 – Magmatic

+0

新しいSubscriptionListener()は、リスナーの例です。独自のリスナ実装を提供することは明らかです。 –

5
public static void admitFriendsRequest() { 
     connection.getRoster().setSubscriptionMode(
     Roster.SubscriptionMode.manual); 
     connection.addPacketListener(new PacketListener() { 
      public void processPacket(Packet paramPacket) { 
       System.out.println("\n\n"); 
       if (paramPacket instanceof Presence) { 
        Presence presence = (Presence) paramPacket; 
        String email = presence.getFrom(); 
        System.out.println("chat invite status changed by user: : " 
          + email + " calling listner"); 
        System.out.println("presence: " + presence.getFrom() 
          + "; type: " + presence.getType() + "; to: " 
          + presence.getTo() + "; " + presence.toXML()); 
        Roster roster = connection.getRoster(); 
        for (RosterEntry rosterEntry : roster.getEntries()) { 
         System.out.println("jid: " + rosterEntry.getUser() 
           + "; type: " + rosterEntry.getType() 
           + "; status: " + rosterEntry.getStatus()); 
        } 
        System.out.println("\n\n\n"); 
        if (presence.getType().equals(Presence.Type.subscribe)) { 
         Presence newp = new Presence(Presence.Type.subscribed); 
         newp.setMode(Presence.Mode.available); 
         newp.setPriority(24); 
         newp.setTo(presence.getFrom()); 
         connection.sendPacket(newp); 
         Presence subscription = new Presence(
           Presence.Type.subscribe); 
         subscription.setTo(presence.getFrom()); 
         connection.sendPacket(subscription); 

        } else if (presence.getType().equals(
          Presence.Type.unsubscribe)) { 
         Presence newp = new Presence(Presence.Type.unsubscribed); 
         newp.setMode(Presence.Mode.available); 
         newp.setPriority(24); 
         newp.setTo(presence.getFrom()); 
         connection.sendPacket(newp); 
        } 
       } 

      } 
     }, new PacketFilter() { 
      public boolean accept(Packet packet) { 
       if (packet instanceof Presence) { 
        Presence presence = (Presence) packet; 
        if (presence.getType().equals(Presence.Type.subscribed) 
          || presence.getType().equals(
            Presence.Type.subscribe) 
          || presence.getType().equals(
            Presence.Type.unsubscribed) 
          || presence.getType().equals(
            Presence.Type.unsubscribe)) { 
         return true; 
        } 
       } 
       return false; 
      } 
     }); 

     connection.getRoster().addRosterListener(new RosterListener() { 
      public void presenceChanged(Presence presence) { 
       System.out.println(presence.getFrom() + "presenceChanged"); 

      } 

      public void entriesUpdated(Collection<String> presence) { 
       System.out.println("entriesUpdated"); 

      } 

      public void entriesDeleted(Collection<String> presence) { 
       System.out.println("entriesDeleted"); 

      } 

      public void entriesAdded(Collection<String> presence) { 
       System.out.println("entriesAdded"); 
      } 
     }); 
    } 
+0

あなたのコード・ダンプのサポートの説明/コメントは、これをもっと便利な答えにします。 –

+0

コメントを付けるのは便利ですが、私はこのコードが非常に役に立ちました。それは明らかに書かれているので、コメントが必要な場合もあります。 –

+0

私は同意する:公式スティックチュートリアル(http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html =>ロスタ/プレゼンストピックと着信パケットトピック)を読んだ後、与えられた上記のコードは非常に便利になります。 – loloof64

関連する問題