无法通过使用击打,开火获得名册的存在 [英] Unable to get presence of roster by using smack, openfire

查看:107
本文介绍了无法通过使用击打,开火获得名册的存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是smack API的新手.我正在尝试开发一个聊天应用程序,该应用程序用于设置和获取在线状态.

I am new to smack API. I am trying to develop a chat application where I was trying for setting and getting the presence.

当我更改用户的状态时,它的工作状况非常好,并且已反映在Openfire服务器中.

When I change the presence of a user, its working perfectly fine and it is getting reflected in the Openfire Server.

但是,当我尝试获取用户的状态时,即使他在openfire中的状态显示为可用",我也始终将状态显示为不可用".

But when I tries to get the Presence of a user, I am always getting the status as 'unavailable' even if his presence in openfire is showing as 'available'.

我正在使用以下代码设置状态.

I am using the following code to set the status.

        Presence presence = new Presence(Presence.Type.available);
        presence.setStatus("Online, Programmatically!");
        presence.setPriority(24);
        presence.setMode(Presence.Mode.available);
        user.getConnection().sendPacket(presence);

我正在使用Roster类来获取出席信息,如下所示.

I am using the Roster class to get the presence as follows.

Roster roster = avatar.getRoster();
Collection<RosterEntry> entries = roster.getEntries();

for(RosterEntry rosterEntry: entries) {
    String user = rosterEntry.getUser();

    Presence presence = roster.getPresence(user);

    System.out.println("Presence : "+presence);                                     // 1
    System.out.println("Presence type: "+presence.getType());                // 2
    System.out.println("Presence mode: "+presence.getMode());             // 3

}

第1行alwasys给出不可用",而第2行和第3行总是给出null

Line No 1 alwasys gives 'unavailable' while line number 2 and 3 always give null

我无法找出导致此问题的原因.请帮助我解决此问题.

I am not able to figure out the cause of this problem. Please help me to resolve this issue.

谢谢.

推荐答案

使用RosterListener是解决此问题的正确方法.没有任何理由使代码具有Thread.sleep()才能使其正常工作.

Using RosterListener is the proper solution to this problem. There is no reason that code should have a Thread.sleep() in order to make it work properly.

Roster roster = con.getRoster();
roster.addRosterListener(new RosterListener() {
    // Ignored events public void entriesAdded(Collection<String> addresses) {}
    public void entriesDeleted(Collection<String> addresses) {}
    public void entriesUpdated(Collection<String> addresses) {}
    public void presenceChanged(Presence presence) {
        System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
    }
});

(来源: http://www.igniterealtime.org /builds/smack/docs/latest/documentation/roster.html )

这篇关于无法通过使用击打,开火获得名册的存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆