无法通过使用击打,开火获得名册的存在 [英] Unable to get presence of roster by using smack, openfire
问题描述
我是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屋!