5

我使用 Smack API 来编写我的 Google talk Client 。现在我需要处理这个添加请求。我将 SubscriptionMode 设置为手动 & 现在我必须为存在数据包注册一个侦听器,但我不知道如何!任何身体都可以帮忙吗?

4

2 回答 2

10

我还没有尝试过,但我想下面应该可以工作。如果使用手动模式,则应注册一个 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,但您可以自定义它,即根据用户 GUI 输入将其设置为 true 或 false。

于 2009-09-17T11:39:48.310 回答
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");
            }
        });
    }
于 2013-06-07T07:39:35.543 回答