Я использую API Smack для написания своего клиента Google Talk. Теперь мне нужно обработать запрос добавления для этого. Я установил SubscriptionMode в руководство & Теперь мне нужно зарегистрировать прослушиватель для пакетов присутствия, но я не знаю, как это сделать !! Может ли любой орган помочь?Как обрабатывать запрос на добавление в smack API
ответ
Я еще не пробовал, но я думаю, что нижеследующее должно работать. При использовании ручного режима необходимо зарегистрировать 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.
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");
}
});
}
Вспомогательное описание/комментарии в вашем дампе кода сделают это гораздо более полезным ответом. –
при поддержке комментариев было бы полезно, я нашел этот код очень полезным. Можно утверждать, что это написано так ясно, что он даже не требует комментариев. –
Я согласен: сначала можно было бы прочитать официальное учебное пособие (http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html => список/тема присутствия и тема входящего пакета), а затем данный код выше становится очень полезным. – loloof64
Я проголосовал, потому что не могу найти класс SubscriptionListener. – Magmatic
new SubscriptionListener() - пример прослушивателя. Очевидно, что вы предоставили бы свою собственную реализацию слушателя. –