smack-在名册中创建条目

Posted

技术标签:

【中文标题】smack-在名册中创建条目【英文标题】:smack- create entry in roster 【发布时间】:2011-07-11 14:16:53 【问题描述】:

我知道之前有人问过这个问题,但 mschonaker here 只给出了部分回复。在我的网站上,用户可以将人员添加到他们的名单中,然后好友必须接受,最后他们被连接。第一人称(用户a)使用著名的

roster.createEntry(jid, name, groups);

这行得通并在他的名单中添加一个条目,但后来我对该怎么做有点困惑:

如何在另一端接收请求?我尝试实现一个 PacketListener,覆盖 processPacket() 并检查哪些类型是 Presence.Type.subscribe 或 Presence.Type.subscribed 的数据包,但它似乎只为用户 a 触发,而不是应该监听的那个订阅 - 用户 b。

那么,我有另一个函数可以在登录时查找所有请求,所以如果我再次登录我会看到请求,但我该如何接受呢?起初,我认为用户 b 也应该在他的名册中添加用户 a roster.createEntry(jid, name, groups);

但这没有用,什么也没有发生。我也试过了

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

但也没有用。我确信一定有一个好的和简单的方法来做到这一点,但到目前为止我还没有在任何地方找到它,一次尝试一件事让我很头疼。有谁知道这个的正确流程?提前致谢!

【问题讨论】:

我也遇到了同样的问题,请您帮忙解决一下 【参考方案1】:

来自 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.Type.subscribe 类型的 Presence 数据包。

所以,尝试将 Roster 的订阅模式设置为手动,然后实现 PacketListener 来监听 Presence.Type.subscribe。收到数据包后,使用 Presence.Type.subscribed 创建一个新数据包并将其发送给发送者。

【讨论】:

嗯,我没有将模式设置为手动,这可能就是为什么,愚蠢的我。我认为这并不重要,因为不这样做就不会自动接受请求。现在就试试这个 所以我设法让它工作,但它有点乱,我想知道是否有更简单的方法:用户a将用户b添加到名册,用户b接收请求并接受(这不会将用户a添加到名册b),然后用户b将用户a添加到他的名册中,用户a需要接受(为什么?因为他首先添加了b),然后它似乎工作...... 是的,应该这样做。看一下 rfc:xmpp.org/rfcs/rfc3921.html#int,第 8.2 节,尤其是最后一段:Upon receiving the presence stanza of type "subscribed", the user SHOULD acknowledge receipt of that subscription state notification through either "affirming" it by sending a presence stanza of type "subscribe" to the contact or "denying" it by sending a presence stanza of type "unsubscribe" to the contact.

以上是关于smack-在名册中创建条目的主要内容,如果未能解决你的问题,请参考以下文章

Smack - 获取条目以特定字母开头

无法通过使用 smack、openfire 获得名册

如何使用 SMACK 在 Android XMPP 客户端中解析自定义花名册查询响应

XMPP XEP-0313 Smack Android 获取所有名册成员的最新消息

XMPP Smack 4.1.0 rc1 异常重新加载名册

除了数据库,openfire 在哪里存储名册值?