2011-04-27 3 views
16

Я использую smack 3.1.0, и когда я добавляю реестр, я не могу получить подписку «оба». кто может мне помочь? ниже мой код:Как добавить список с режимом подписки «оба»

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

после выполнения кода, я наблюдал в Openfire подписки является «»

ответ

9

Оба пользователи должны подписаться на друг друга. Отправляя строфу подписки присутствия. В Smack:

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

Section 3.1 of the RFC6121 предоставит вам семантические данные.

+0

Большое спасибо, это было то, что я искал! – vsm

+0

Если пользователь добавлен из любого другого источника, прослушивает прослушиватель пакетов и отправляет Подписаться на jid, так оно работает, и вы можете видеть подписку как «обе» в списке списка. Если используется тип подписанный, то подписка будет от (запрос отправки списка) и (список, которому отправлен запрос) – Zoombie

+0

Здравствуйте. но где написать этот два кода для подписки на обе стороны –

37

Перезапись ответа @ mschonaker, чтобы быть немного более понятной.

Пользователям необходимо подписаться друг с другом и принять заявку на получение подписки. Назовем их Алисой и Боб. Алиса посылает запрос на подписку Бобу:

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

Когда Боб получает запрос, он утверждает его:

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

Боб также может быть заинтересован в присутствии Алис, поэтому он выписывает ей:

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

И Алиса должна одобрить запрос Боба:

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

Section 3.1 of RFC6121 - текущая лучшая ссылка на то, как это работает.

+1

Привет. но где писать этот два кода для подписки на обе стороны –

+0

, если я использую подписку на то, что мне нужно использовать JID здесь signed.setTo (jid); я могу добавить запись в свою учетную запись, но я не получаю присутствие этой записи. Скажите мне, что я должен сделать для этого. –

+0

Надеюсь, я прояснил ситуацию. –

2

Хорошо, я много работал над этим в течение нескольких дней и, наконец, получил работу. Спасибо @Joe Hildebrand, ваш ответ поставил меня на правильный путь, чтобы решить эту проблему. Я реализовал его в режиме ручной подписки (т. Е. Пользователю необходимо принять запрос другого пользователя вручную).

Сервер продолжает подталкивать запрос подписки пользователю (при повторном входе в систему), если пользователь не отправил подписанную или отмененную подписку. Итак, что вы можете сделать, это сохранить входящие запросы подписки локально в списке и отобразить это как «список запросов друга» для ручной приемки/отклонения. Если ваше приложение перезапустится (и, следовательно, снова подключится к серверу), сервер снова будет запрашивать запросы на подписку.

Вот как это работает:

  • User1 посылает подписываться присутствие Пользователю2.
  • Запись реестров автоматически создается в реестре User1 (но не в реестре User2).
  • Пользователь2 получает запрос на подписку от User1.
  • Пользователь2 отправляет подписку на подписку на User2 (User2> User1 complete complete).
  • User2 проверяет, является ли User1 в реестре User2. Пользователь1 не входит в список User2. Пользователь2 отправляет обратно подписку на User1.
  • Запись реестров автоматически создается в реестре User2.
  • Пользователь1 получает подписное присутствие от User2.
  • User1 проверяет, является ли User2 в реестре пользователя1. User2 находится в списке User1. Пользователь1 отправляет обратно подписанное присутствие на подписку User2 (User2> User1).

     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

Если вы используете открытый сервер огня можно также использовать User Service plugin, который будет создавать список с подпиской и ...

1

Такая же проблема я лицо, но я получил решение, как подписываются установить ' как»

Ниже посылает подписку на пользователя, при добавлении пользователя

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

     RoosterConnection.getConnection().sendStanza(pres); 

nd Receiving end put ниже метод в классе соединений, а свойство presenceChanged - метод 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(); 
    } 
}