打击 - 创建名册中的条目

Gui*_*ume 6 xmpp rostering smack

我知道之前已经问过这个问题,但mschonaker 在这里只给出了部分回复.在我的网站上,用户可以将人员添加到他们的名单中,然后伙伴必须接受并最终连接.第一个人(用户a)使用着名的

roster.createEntry(jid, name, groups);

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

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

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

但这没有用,也没有发生任何事情.我也试过

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo(jid);
xMPPConnection.sendPacket(subscribed);
Run Code Online (Sandbox Code Playgroud)

但也没用.我确信必须有一个好的和简单的方法来做到这一点,但到目前为止我还没有找到它,并且一次尝试一件事给了我太多麻烦.有谁知道这个正确的流程?提前致谢!

Mag*_*gie 4

来自 Smack 文档:花名册和状态使用基于权限的模型,其中用户必须授予权限才能将其添加到其他人的花名册中。这样可以确保只有经过批准的用户才能查看其状态信息,从而保护用户的隐私。因此,当您添加新的名册条目时,它将处于待处理状态,直到其他用户接受您的请求。如果其他用户请求在线状态订阅以便将您添加到他们的名册中,您必须接受或拒绝该请求。Smack 通过以下三种方式之一处理状态订阅请求:

Automatically accept all presence subscription requests.
Automatically reject all presence subscription requests.
Process presence subscription requests manually. 
Run Code Online (Sandbox Code Playgroud)

可以使用 Roster.setSubscriptionMode(Roster.SubscriptionMode) 方法设置模式。简单客户端通常使用其中一种自动订阅模式,而全功能客户端应手动处理订阅请求并让最终用户接受或拒绝每个请求。如果使用手动模式,则应注册一个 PacketListener,用于侦听类型为 Presence.Type.subscribe 的 Presence 数据包。

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