xmpp - smack- 在花名册中创建条目

标签 xmpp smack rostering

我知道之前有人问过这个问题,但 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);
    

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

    最佳答案

    从 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 创建一个新数据包并将其发送给发送方。

    关于xmpp - smack- 在花名册中创建条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6651490/

    相关文章:

    database - Ejabberd 的名册管理

    ios - 如何使用XMPP进行广播?

    xmpp - 匿名用户如何在 Jabber (Ejabberd) 上与有效用户交换在线状态信息

    python - XMPP 聊天客户端 - 未收到发送至 Google Talk 的某些 IM 消息

    java - XMPP - Facebook - 我的客户端实现如何接收其他客户端实现发送的消息?

    java - 简单的 smack jabber 程序需要很长时间才能在 android 上连接

    java - 使用 Smack 在 XMPP 消息中发送 <a>m 中的链接或具有相同效果的内容

    python - 最大化一系列值的组合

    python - xmpp:2 个客户使用同一帐户

    java - 无法使用 Beem-Asmack 在 XMPP FileTransfer 中处理上传