java xmpp smack

java - cómo agregar lista con el modo de suscripción "ambos"



xmpp smack (5)

Ambos usuarios necesitan suscribirse entre sí. Enviando una stanza de suscripción de presencia. En Smack:

Presence presence = new Presence(Presence.Type.subscribe); presence.setTo(jid); connection.sendPacket(presence);

La sección 3.1 de la RFC6121 le dará los detalles semánticos.

Estoy usando smack 3.1.0, y cuando agrego una lista, no puedo obtener la suscripción "ambos". ¿Quién puede ayudarme? abajo está mi código:

Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all); Roster roster = connection.getRoster(); roster.createEntry("[email protected]","me",null)

Después de la ejecución del código, observé en Openfire que la suscripción es "a"


Bueno, trabajé duro en esto por un par de días y finalmente conseguí que las cosas funcionaran. Gracias @Joe Hildebrand, su respuesta me puso en el camino correcto para resolver esto. Lo he implementado con un modo de suscripción manual (es decir, el usuario debe aceptar la solicitud de otro usuario manualmente).

El servidor sigue enviando la solicitud de suscripción al usuario (al volver a iniciar sesión) si el usuario no ha enviado una suscripción suscrita o anulada. Entonces, lo que puede hacer es guardar las solicitudes de suscripción entrantes localmente en una lista y mostrarlas como una "lista de solicitud de amistad" para la aceptación / rechazo manual. Si su aplicación se reinicia (y, por lo tanto, se vuelve a conectar al servidor), el servidor volverá a enviar solicitudes de suscripción.

Así es como funciona:

  • Usuario1 envía presencia de suscripción a Usuario2.
  • La entrada de la lista se crea automáticamente en la lista del Usuario1 (pero no en la lista del Usuario2).
  • Usuario2 recibe solicitud de suscripción de Usuario1.
  • Usuario2 envía una presencia suscrita a Usuario2 (Usuario2> Suscripción de Usuario1 completa).
  • User2 comprueba si User1 está en la lista de User2. User1 no está en la lista de User2. Usuario2 devuelve una presencia de suscripción a Usuario1.
  • La entrada de la lista se crea automáticamente en la lista de User2.
  • Usuario1 recibe la presencia de suscripción de Usuario2.
  • User1 comprueba si User2 está en la lista de User1. User2 está en la lista de User1. Usuario1 devuelve una presencia suscrita a Usuario2 (Usuario2> Suscripción de Usuario1 completa).

    final Presence newPresence = (Presence) packet; final Presence.Type presenceType = newPresence.getType(); final String fromId = newPresence.getFrom(); final RosterEntry newEntry = getRoster().getEntry(fromId); if (presenceType == Presence.Type.subscribe) { //from new user if (newEntry == null) { //save request locally for later accept/reject //later accept will send back a subscribe & subscribed presence to user with fromId //or accept immediately by sending back subscribe and unsubscribed right now } //from a user that previously accepted your request else { //send back subscribed presence to user with fromId } }


El mismo problema al que me enfrenté, pero obtuve la solución de cómo suscribirse configuraba ''ambos''

A continuación está el envío de suscripción al usuario, cuando se agregó el usuario

Presence pres = new Presence(Presence.Type.subscribed); pres.setPriority(24); pres.setMode(Presence.Mode.available); pres.setTo(friendJid); RoosterConnection.getConnection().sendStanza(pres);

y El método Receiver end put below en la clase de conexión y presenceChanged es el método predeterminado de RosterListener.

@Override public void presenceChanged(Presence presence) { mBus.post(presence); try { Presence pres = new Presence(Presence.Type.subscribed); pres.setTo(presence.getFrom()); RoosterConnection.getConnection().sendStanza(pres); } catch (SmackException.NotConnectedException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }


Reescribiendo @ mschonaker la respuesta para ser un poco más clara.

Ambos usuarios deben suscribirse entre sí y aceptar la solicitud de suscripción que recibieron. Llamémoslos Alice y Bob. Alice envía una solicitud de suscripción a Bob:

Presence subscribe = new Presence(Presence.Type.subscribe); subscribe.setTo(''[email protected]''); connection.sendPacket(subscribe);

Cuando Bob recibe la solicitud, la aprueba:

Presence subscribed = new Presence(Presence.Type.subscribed); subscribed.setTo(''[email protected]''); connection.sendPacket(subscribed);

Bob también puede estar interesado en la presencia de Alice, por lo que se suscribe a ella:

Presence subscribe = new Presence(Presence.Type.subscribe); subscribe.setTo(''[email protected]''); connection.sendPacket(subscribe);

Y Alice necesita aprobar la petición de Bob:

Presence subscribed = new Presence(Presence.Type.subscribed); subscribed.setTo(''[email protected]''); connection.sendPacket(subscribed);

La Sección 3.1 de RFC6121 es la mejor referencia actual sobre cómo funciona esto.