2009-08-26 7 views
5

Io uso l'API Smack per scrivere il mio client Google Talk. Ora ho bisogno di gestire la richiesta di aggiunta per questo. Ho impostato SubscriptionMode sul manuale & ora devo registrare un listener per i pacchetti di presenza ma non so come !! può qualche aiuto del corpo?Come gestire la richiesta di aggiunta nell'API smack

risposta

9

Non l'ho ancora provato, ma suppongo che il sotto dovrebbe funzionare. Se si utilizza la modalità manuale, è necessario registrare un PacketListener che rileva i pacchetti di presenza con un tipo di Presence.Type.subscribe.

Prima impostare il roster:

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

quindi aggiungere un listner pacchetto al collegamento di cui sopra, ad esempio:

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

Il codice precedente restituisce solo vero per tutte le richieste, ma è possibile personalizzarla vale a dire impostarlo su true o false sulla base dell'input della GUI dell'utente.

+0

Ho votato perché non riesco a trovare una classe SubscriptionListener. – Magmatic

+0

new SubscriptionListener() è un listener di esempio. È ovvio che forniresti la tua implementazione per l'ascoltatore. –

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

Una descrizione/commenti di supporto nel dump del codice renderebbe questa una risposta molto più utile. –

+0

mentre il supporto dei commenti sarebbe utile, ho trovato questo codice molto utile. Si potrebbe sostenere che è scritto in modo così chiaro che non richiede nemmeno commenti. –

+0

Sono d'accordo: prima leggerei tutorial ufficiale smack (http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html => argomento roster/presenza e argomento pacchetto in entrata) e poi il dato il codice sopra diventa molto utile. – loloof64