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
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.
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");
}
});
}
Una descrizione/commenti di supporto nel dump del codice renderebbe questa una risposta molto più utile. –
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. –
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
Ho votato perché non riesco a trovare una classe SubscriptionListener. – Magmatic
new SubscriptionListener() è un listener di esempio. È ovvio che forniresti la tua implementazione per l'ascoltatore. –