smack - создать запись в реестре - PullRequest
6 голосов
/ 11 июля 2011

Я знаю, что этот вопрос задавался ранее, но mschonaker here дал только частичный ответ. На моем веб-сайте пользователь может добавить людей в свой список, а затем приятель должен принять его и, наконец, они подключены. Первый человек (пользователь а) пользуется знаменитым

roster.createEntry(jid, name, groups);

, который работает и добавляет запись в свой список, но потом я немного запутался в том, что делать:

  • как получить запрос на другом конце? Я попытался реализовать PacketListener, переопределить processPacket () и проверить пакет, типы которого являются Presence.Type.subscribe или Presence.Type.subscribeed, но похоже, что он срабатывает только для пользователя a, но не тот, который должен прослушивать подписки - пользователь b.

  • тогда у меня есть другая функция, которая может искать все запросы при входе в систему, поэтому, если я снова войду в систему, я увижу запрос, но как мне его принять? Сначала я подумал, что пользователь b должен также добавить пользователя a в свой список roster.createEntry(jid, name, groups);

но это не сработало и ничего не происходило. Я тоже пытался сделать

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

но тоже не сработало. Я уверен, что должен быть хороший и простой способ сделать это, но я так далеко не нашел его, и попытка сделать что-то одно за разом доставила мне слишком много головной боли. Кто-нибудь знает правильный поток для этого? заранее спасибо!

1 Ответ

4 голосов
/ 13 июля 2011

Из документации Smack: реестры и сведения о присутствии используют модель на основе разрешений, в которой пользователи должны давать разрешение, прежде чем они будут добавлены в чей-либо список.Это защищает конфиденциальность пользователя, гарантируя, что только утвержденные пользователи могут просматривать информацию о своем присутствии.Поэтому при добавлении новой записи в реестр она будет находиться в состоянии ожидания, пока другой пользователь не примет ваш запрос.Если другой пользователь запрашивает подписку о присутствии, чтобы добавить вас в свой список, вы должны принять или отклонить этот запрос.Smack обрабатывает запросы на подписку о присутствии одним из трех способов:

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

Режим можно установить с помощью метода Roster.setSubscriptionMode (Roster.SubscriptionMode).Простые клиенты обычно используют один из автоматических режимов подписки, в то время как полнофункциональные клиенты должны вручную обрабатывать запросы на подписку и позволять конечному пользователю принимать или отклонять каждый запрос.При использовании ручного режима должен быть зарегистрирован PacketListener, который прослушивает пакеты Presence, имеющие тип Presence.Type.subscribe.

Итак, попробуйте установить режим подписки Ростера на ручной, а затем внедрите PacketListener для прослушивания Presence.Type.subscribe.После получения пакета создайте новый пакет с подпиской Presence.Type и отправьте его отправителю.

...