在 XMPP 客户端中更改传出状态节

Posted

技术标签:

【中文标题】在 XMPP 客户端中更改传出状态节【英文标题】:Change Outgoing Presence Stanza in XMPP Client 【发布时间】:2011-06-13 20:35:23 【问题描述】:

我正在使用 Smack API for Java 连接到 ejabberd 和 gtalk 服务器。我可以正常连接和登录,但我想进行 1 次小修改。

如何更改已登录用户的出席信息节?

例如,给定节:

<presence to="someone@someServer.com/androidd5a3arer3"
      from="me@someServer.com/Smack">
  <status></status>
  <priority>24</priority>
  <show>away</show>
  <c xmlns="http://jabber.org/protocol/caps"></c>
  <x xmlns="vcard-temp:x:update">
    <photo>asefe3a33e</photo>
  </x>
</presence>

我想在将数据包发送给其他人之前附加一个这样的新字段:

<presence to="someone@someServer.com/androidd5a3arer3"
      from="me@someServer.com/Smack">
  <status></status>
  <priority>24</priority>
  <show>away</show>
  <c xmlns="http://jabber.org/protocol/caps"></c>
  <x xmlns="vcard-temp:x:update">
    <photo>asefe3a33e</photo>
  </x>
<NEW_FIELD> NEW STUFF HERE </NEW_FIELD>
</presence>

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

在 XMPPConnection 上调用 addPacketInterceptor:

connection.addPacketInterceptor(new PacketInterceptor() 
        public void interceptPacket(Packet packet) 
            // modify packet
        
    , new PacketTypeFilter(Presence.class));

addPacketInterceptor 的docs 说:

用这个连接注册一个数据包拦截器。每当此连接即将发送数据包时,都会调用拦截器。拦截器可能会修改要发送的数据包。数据包过滤器确定哪些数据包将被传递给拦截器。

【讨论】:

谢谢。这正是我需要的!

以上是关于在 XMPP 客户端中更改传出状态节的主要内容,如果未能解决你的问题,请参考以下文章

如何在浏览器中隐藏我的 xmpp 节?

在 XMPP 服务器上将 IQ 节超时更改为 5 秒的可能影响

如何在 slimxmpp python 中为 gcm ccs 请求创建 xmpp 节?

xmpp 资源是不是更改?

Android with Asmack - 当我连接到 XMPP 时如何获取当前状态信息?

修改 XMPP Presence 节