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

Java 如何使用SMACK解析Android XMPP客户端中的自定义花名册查询响应,java,android,xmpp,smack,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"/

至于现在,我对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>
听众:

private class RosterPacketListener implements PacketListener {

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

我完全不明白的是,
Log.d(“tag”,packet.toXML())的输出不包含
msgblock
参数。如何访问花名册中的
msgblock
参数?

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

从服务器获取所有名册

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());
}
花名册=mConnection.get花名册();
//从花名册对象收集花名册
集合条目=花名册.getEntries();
对于(排班条目:条目)
{
Log.i(“RosterName”,“Name:+entry.getName());
Log.i(“RosterName”,“Name:+entry.getUser());
}

msgblock
显示为非标准属性。你不应该依赖那些。如果你知道发明它的人在哪里,那么你就不应该发明那些。@Flow:正是这样,花名册项不包含这个参数。不幸的是,我不是添加此内容的人,所以我正在寻找解决此问题的方法。请注意,RFC3121已被弃用,您应该参考RFC6121。获取非标准属性值的唯一方法是修补Smack@Flow有没有办法在传入的数据包被反序列化到SMACK的数据包对象之前拦截它们的原始形式?最终使用调试器。但我高度怀疑这是一条道路。答案是:没有。您不应该使用这些属性。
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());
}