2011-04-27 3 views

risposta

9

Entrambi gli utenti hanno bisogno di sottoscrivere gli uni agli altri. Inviando una stanza di sottoscrizione di presenza. In Smack:

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

Section 3.1 of the RFC6121 vi darà i dettagli semantici.

+0

Grazie mille, questo era quello che stavo cercando! – vsm

+0

Se l'utente ha aggiunto da qualsiasi altra fonte, ascolta il listener di pacchetti e invia Subscribe to jid, questo è il modo in cui funziona e puoi vedere l'abbonamento come "entrambi" nell'elenco di roster. Se viene utilizzato il tipo di abbonamento, la sottoscrizione sarà da (richiesta di invio roster) e (elenco a cui viene inviata la richiesta) – Zoombie

+0

Ciao. ma dove scrivere questo codice due per iscriversi entrambi i lati –

37

riscrittura risposta di @ mschonaker ad essere un po 'più chiaro.

Entrambi gli utenti devono iscriversi l'uno all'altro e accettare la richiesta di iscrizione ricevuta. Chiamiamoli Alice e Bob. Alice invia una richiesta di abbonamento a Bob:

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

Quando Bob riceve la richiesta, egli approva:

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

Bob può anche essere interessati a presenza di Alice, così si sottoscrive a lei:

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

e Alice ha bisogno di approvare la richiesta di Bob:

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

Section 3.1 of RFC6121 è l'attuale migliore riferimento per come funziona.

+1

Ciao. ma dove scrivere questo codice due per iscriversi entrambi i lati –

+0

se uso Sottoscritto quello che devo usare JID qui subscribed.setTo (jid); Sono in grado di aggiungere la voce al mio account, ma non sto ottenendo la presenza di quella voce. Dimmi cosa devo fare per quello. –

+0

Spero di averlo reso più chiaro. –

2

Va bene, ho faticato duro a questo per un paio di giorni e finalmente le cose di lavoro. Grazie @Joe Hildebrand, la tua risposta mi ha messo sulla strada giusta per risolvere questo problema. L'ho implementato con una modalità di iscrizione manuale (ad esempio, l'utente deve accettare manualmente la richiesta di un altro utente).

Il server continua a spingere iscriviti richiesta per l'utente (a ri-login) se l'utente non ha inviato un back iscriversi o ritirarsi. Quindi, ciò che puoi fare è salvare localmente le richieste di sottoscrizione in arrivo in un elenco e visualizzarle come "elenco di richieste di amicizia" per accettare/rifiutare manualmente. Se l'applicazione viene riavviata (e quindi si riconnette al server), il server invierà nuovamente le richieste di iscrizione.

Questo è come funziona:

  • Utente1 invia iscriviti presenza di Utente2.
  • ingresso Roster viene creato automaticamente in roster di Utente1 (ma non in roster dell'Utente2).
  • Utente2 riceve la richiesta di iscrizione da Utente1.
  • Utente2 restituisce una presenza sottoscritto User2 (Utente2 abbonamento> Utente1 completo).
  • Utente2 verifica se Utente1 è nel roster di Utente2. Utente1 non è nel roster di User2. Utente2 rimanda una presenza di sottoscrizione a Utente1.
  • La voce del roster viene creata automaticamente nel roster di User2.
  • Utente1 riceve la presenza di sottoscrizione da Utente2.
  • Utente1 verifica se Utente2 è nel roster Utente1. Utente2 è nel roster di User1. Utente1 restituisce una presenza sottoscritta a Utente2 (Utente2> Sottoscrizione Utente1 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 
          } 
         } 
    
1

Se si utilizza il server fuoco aperto è anche possibile utilizzare User Service plugin che creerà roster con abbonamento sia ...

1

Stesso problema ero faccia, ma ho avuto la soluzione come iscriviti set ' sia'

Qui di seguito è l'invio di sottoscrizione per l'utente, quando è stato aggiunto l'utente

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

     RoosterConnection.getConnection().sendStanza(pres); 

e Receiving end put below method in connection class e presenceChanged è il metodo predefinito di 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(); 
    } 
} 
Problemi correlati