2009-08-26 2 views
5

Я использую API Smack для написания своего клиента Google Talk. Теперь мне нужно обработать запрос добавления для этого. Я установил SubscriptionMode в руководство & Теперь мне нужно зарегистрировать прослушиватель для пакетов присутствия, но я не знаю, как это сделать !! Может ли любой орган помочь?Как обрабатывать запрос на добавление в smack API

ответ

9

Я еще не пробовал, но я думаю, что нижеследующее должно работать. При использовании ручного режима необходимо зарегистрировать PacketListener, который прослушивает пакеты присутствия, имеющие тип Presence.Type.subscribe.

Сначала установите реестром:

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 или false на основе ввода пользовательского GUI.

+0

Я проголосовал, потому что не могу найти класс SubscriptionListener. – Magmatic

+0

new 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