Как добавить список с режимом подписки "оба"
Я использую smack 3.1.0, и когда я добавляю список, я не могу получить подписку "оба". кто может мне помочь?
ниже мой код:
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
Roster roster = connection.getRoster();
roster.createEntry("[email protected]","me",null)
после выполнения кода, я наблюдал в openfire, что подписка "на"
Ответы
Ответ 1
Переписывание @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);
Раздел 3.1 RFC6121 является лучшим справочником о том, как это работает.
Ответ 2
Оба пользователя должны подписаться друг с другом. Отправляя строфу подписки присутствия. В Smack:
Presence presence = new Presence(Presence.Type.subscribe);
presence.setTo(jid);
connection.sendPacket(presence);
Раздел 3.1 RFC6121 даст вам семантические данные.
Ответ 3
Хорошо, я много работал над этим пару дней и, наконец, начал работать. Спасибо @Joe Hildebrand, ваш ответ поставил меня на правильный путь, чтобы решить эту проблему. Я реализовал его в режиме ручной подписки (т.е. Пользователю необходимо принять другой запрос пользователя вручную).
Сервер продолжает подталкивать запрос подписки пользователю (после повторного входа в систему), если пользователь не отправил подписанную или отмененную подписку. Итак, что вы можете сделать, это сохранить входящие запросы подписки локально в списке и отобразить это как "список запросов друга" для ручной приемки/отклонения. Если ваше приложение перезапустится (и, следовательно, снова подключится к серверу), сервер снова предложит запросы подписки.
Вот как это работает:
- Пользователь1 отправляет подписку на пользователя2.
- Запись реестров автоматически создается в списке User1 (но не в реестре User2).
- Пользователь2 получает запрос на подписку от User1.
- Пользователь2 отправляет обратно подписанное присутствие на подписку User2 (User2 > User1).
- Пользователь2 проверяет, является ли User1 в реестре User2. Пользователь1 не входит в список User2. Пользователь2 отправляет обратно подписку на User1.
- Запись реестров автоматически создается в реестре User2.
- Пользователь1 получает доступ к подписке от User2.
-
Пользователь1 проверяет, является ли User2 в списке User1. Пользователь2 находится в списке 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
}
}
Ответ 4
Если вы используете open fire server, вы также можете использовать плагин User Service, который будет создавать список с подпиской как...
Ответ 5
Та же проблема, с которой я столкнулся, но я получил решение, как подписаться на "оба"
Ниже отправляется подписка на пользователя, когда вы добавили пользователя
Presence pres = new Presence(Presence.Type.subscribed);
pres.setPriority(24);
pres.setMode(Presence.Mode.available);
pres.setTo(friendJid);
RoosterConnection.getConnection().sendStanza(pres);
а метод Receive end помещается ниже в классе соединений, а свойство 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();
}
}