2011-07-11 18 views
6

Sé que esta pregunta se ha hecho antes, pero solo una respuesta parcial ha sido dada por mschonaker here. En mi sitio web, el usuario puede agregar personas a su lista, luego el amigo tiene que aceptar y finalmente están conectados. La primera persona (usuario A) utilice el famososmack-create entry in roster

roster.createEntry(jid, name, groups);

que trabaja y añadir una entrada en su lista, pero entonces yo soy un poco confundido acerca de qué hacer:

  • cómo hacer Recibo la solicitud en el otro extremo? Intenté implementar un PacketListener, anular el ProcessPacket() y verificar el paquete cuyos tipos son Presence.Type.subscribe o Presence.Type.subscribed, pero parece que solo se activa para el usuario a, pero no para el que debería escuchar. suscripciones- usuario b.

  • luego, tengo otra función que puede buscar todas las solicitudes al iniciar sesión, así que si vuelvo a acceder veré la solicitud, pero ¿cómo la acepto? Al principio, pensé que el usuario B también debe agregar un usuario en su lista de roster.createEntry(jid, name, groups);

pero que no funcionaba y no pasaba nada. También traté de hacer

Presence subscribed = new Presence(Presence.Type.subscribed); 
subscribed.setTo(jid); 
xMPPConnection.sendPacket(subscribed); 

pero tampoco funcionó. Estoy seguro de que debe haber una manera buena y simple de hacerlo, pero no lo he encontrado hasta ahora en ninguna parte, y probar una cosa a la vez me dio demasiados dolores de cabeza. ¿Alguien sabe el flujo correcto para esto? ¡gracias por adelantado!

+0

Me enfrento al mismo problema, ¿pueden ayudarme con respecto al mismo –

Respuesta

4

De la documentación de Smack: Las listas y la presencia utilizan un modelo basado en permisos donde los usuarios deben dar permiso antes de que se agreguen a la lista de otra persona. Esto protege la privacidad del usuario al garantizar que solo los usuarios aprobados puedan ver su información de presencia. Por lo tanto, cuando agrega una nueva entrada de lista, estará en estado pendiente hasta que el otro usuario acepte su solicitud. Si otro usuario solicita una suscripción de presencia para que puedan agregarlo a su lista, debe aceptar o rechazar esa solicitud. Smack maneja las solicitudes de suscripción de presencia en una de tres maneras:

Automatically accept all presence subscription requests. 
Automatically reject all presence subscription requests. 
Process presence subscription requests manually. 

El modo se puede ajustar utilizando el método Roster.setSubscriptionMode (Roster.SubscriptionMode). Los clientes simples normalmente usan uno de los modos de suscripción automáticos, mientras que los clientes con todas las funciones deben procesar manualmente las solicitudes de suscripción y dejar que el usuario final acepte o rechace cada solicitud. Si usa el modo manual, se debe registrar un PacketListener que escuche los paquetes de Presence que tienen un tipo de Presence.Type.subscribe.

Por lo tanto, intente configurar el modo de suscripción de Roster en manual, y luego implemente PacketListener para escuchar Presence.Type.subscribe. Una vez que se recibe un paquete, cree un nuevo paquete con Presence.Type.subscribed y envíelo al remitente.

+0

? Hum No configuré el modo en manual, probablemente sea por eso, estúpido. Pensé que realmente no importaba ya que al no hacerlo, no aceptaba automáticamente las solicitudes. Intentaré esto ahora – Guillaume

+0

, así que logré que funcione, pero es un poco complicado, me pregunto si hay una manera más simple: usuario a agregar usuario b a la lista, usuario b recibir solicitud y aceptar (esto no agrega un usuario a la lista b), luego el usuario b agrega el usuario a a su lista, y el usuario necesita aceptar (¿por qué? ya que agregó b en primer lugar), entonces parece funcionar ... – Guillaume

+0

Sí, así es como debería hacerse. Eche un vistazo al rfc: http://xmpp.org/rfcs/rfc3921.html#int, sección 8.2., Especialmente el último párrafo: 'Al recibir la stanza de presencia del tipo" suscrito ", el usuario DEBE acusar recibo de esa notificación de estado de suscripción a través de "afirmarlo" enviando una estrofa de presencia de tipo "suscribir" al contacto o "denegar" al enviar una estrofa de presencia de tipo "cancelar suscripción" al contacto. – Maggie