2009-08-26 32 views
5

Tôi sử dụng API Smack để viết ứng dụng khách Google Talk của mình. Bây giờ tôi cần phải xử lý thêm yêu cầu cho việc này. Tôi đã đặt SubscriptionMode thành thủ công & bây giờ tôi phải đăng ký một người nghe cho các gói hiện diện nhưng tôi không biết làm thế nào !! có thể giúp cơ thể nào không?Cách xử lý yêu cầu thêm trong smack API

Trả lời

9

Tôi chưa thử, nhưng tôi đoán dưới đây sẽ hoạt động. Nếu sử dụng chế độ thủ công, một PacketListener sẽ được đăng ký để lắng nghe các gói Presence có loại Presence.Type.subscribe.

Đầu tiên thiết lập danh sách:

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

Sau đó, thêm một listner gói để kết nối ở trên, ví dụ:

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

Đoạn mã trên chỉ trả về đúng cho tất cả các yêu cầu, Nhưng bạn có thể tùy chỉnh nó tức là đặt thành true hoặc false dựa trên đầu vào GUI của người dùng.

+0

Tôi đã bỏ phiếu vì tôi không thể tìm thấy lớp SubscriptionListener. – Magmatic

+0

SubscriptionListener mới() là trình nghe ví dụ. Rõ ràng bạn sẽ cung cấp việc thực hiện trình lắng nghe của riêng bạn. –

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

Mô tả/nhận xét hỗ trợ trong đoạn mã của bạn sẽ làm cho câu trả lời này hữu ích hơn nhiều. –

+0

trong khi hỗ trợ nhận xét sẽ hữu ích, tôi thấy mã này rất hữu ích. Người ta có thể lập luận rằng nó được viết rất rõ ràng, nó không đòi hỏi bình luận ngay cả. –

+0

Tôi đồng ý: người đầu tiên sẽ đọc hướng dẫn chính thức về smack (http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html => danh sách/chủ đề hiện diện và chủ đề gói đến) và sau đó là mã ở trên trở nên rất hữu ích. – loloof64

Các vấn đề liên quan