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

时间:2015-02-26 16:24:23

标签: java android xmpp smack

至于现在我对XMPP和SMACK的了解很少,所以如果我的问题不精确,请原谅。

登录后,我收到包含名单的数据包,如下所示:

<iq id="8CiUQ-1" type="result">
    <query xmlns="jabber:iq:roster">
    <item jid="625126126@saomeapp-test.cloudapp.net" name="Aziez" subscription="both" msgblock="none"/>
    <item jid="547657221@saomeapp-test.cloudapp.net" name="Kmil" subscription="both" msgblock="none"/>
    <item jid="553269257@saomeapp-test.cloudapp.net" name="grzegorz" subscription="both" msgblock="none"/>
    <item jid="683494364@saomeapp-test.cloudapp.net" name="Wiktor2" subscription="both" msgblock="none"/>
    <item jid="602914857@saomeapp-test.cloudapp.net" name="Art" subscription="both" msgblock="none"/>
    <item jid="634926524@saomeapp-test.cloudapp.net" name="ml" subscription="both" msgblock="none"/>
    </query>
</iq>

我知道这是因为我可以在SMACK标签下看到这个数据包打印到我的logcat。

我需要访问msgblock参数。 org.jivesoftware.smack.RosterEntry类不会有msgblock参数的getter,因为它是自定义的服务器实现(我想)。我如何访问msgblock参数呢?

以下是我的尝试:

我致电:mConnection.addPacketListener(new RosterPacketListener(), new RosterPacketFilter());其中mConnectionorg.jivesoftware.smack.XMPPConnection;的实例。

过滤器看起来像这样:

    private class RosterPacketFilter implements PacketFilter{

        @Override
        public boolean accept(Packet packet) {
            return packet instanceof RosterPacket;
        }
    }

监听器:

private class RosterPacketListener implements PacketListener {

    @Override
    public void processPacket(Packet packet) {
        Log.d("tag", packet.toXML());
    }
}

我完全不理解的部分是Log.d("tag", packet.toXML());的输出不包含msgblock参数。如何访问我的名单中的msgblock参数?

1 个答案:

答案 0 :(得分:0)

无需向连接对象添加自定义数据包侦听器。

从服务器获取所有名单

Roster roster = mConnection.getRoster();
// collection of RosterEntry from roster object
Collection<RosterEntry> entries= roster.getEntries();

for(RosterEntry entry : entries)
{
    Log.i("RosterName", "Name : "+ entry.getName());
    Log.i("RosterName", "Name : "+ entry.getUser());
}