我是新手的API。我正在尝试开发一个聊天应用程序,我正在尝试设置和获取存在。
当我更改用户的状态时,它的工作非常精细,并且会在Openfire服务器中反映出来。
但是当我试图获得用户的存在时,即使他在openfire中的存在显示为“可用”,我也总是将状态设置为“不可用”。
我使用以下代码设置状态。
Presence presence = new Presence(Presence.Type.available);
presence.setStatus("Online, Programmatically!");
presence.setPriority(24);
presence.setMode(Presence.Mode.available);
user.getConnection().sendPacket(presence);
我正在使用Roster类来获取以下内容。
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行总是给出空
我无法弄清楚这个问题的原因。请帮我解决这个问题。
提前致谢。
答案 0 :(得分:8)
使用RosterListener
是解决此问题的正确方法。没有理由代码应该有Thread.sleep()
才能使其正常工作。
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)
答案 1 :(得分:7)
问题是,在立即登录后,用户的存在需要一些时间来更新。所以在登录和调用在线好友功能之间应该有一个thread.sleep()几秒钟然后将检索在线联系人。我做到了,并能够检索它们。 登录后使用
的Thread.sleep(5000);
在方法的开头使用
答案 2 :(得分:3)
我遇到了同样的问题,并在找到问题所在之前搜索了一段时间。实际上,您不需要执行Thread.sleep()。问题是你没有“许可”来获得其他用户的存在。
要解决此问题,请进入Openfire管理员 - &gt;您的用户选项 - &gt;名单//然后只需设置好友的订阅即可获得“两者”(两个用户都可以查看彼此的存在)。
希望这有帮助。
编辑:实际上你需要在从连接获取名单之前添加一个Thread.sleep()。没有Thread.sleep(),有时它可以工作,有时候不会......
答案 3 :(得分:2)
我修复了它:
if (!roster.isLoaded())
roster.reloadAndWait();
后:
Roster roster = Roster.getInstanceFor(connection);
答案 4 :(得分:0)
此完整代码
public void getRoaster(final Callback<List<HashMap<String, String>>> callback) {
final Roster roster = Roster.getInstanceFor(connection);
boolean success = true;
if (!roster.isLoaded())
try {
roster.reloadAndWait();
} catch (SmackException.NotLoggedInException | SmackException.NotConnectedException | InterruptedException e) {
android.util.Log.e(AppConstant.PUBLIC_TAG, TAG + " " + e.getMessage());
success = false;
}
if (!success) {
if (callback != null) {
callback.onError(new Throwable());
}
}
Collection<RosterEntry> entries = roster.getEntries();
List<HashMap<String, String>> maps = new ArrayList<HashMap<String, String>>(entries.size());
for (RosterEntry entry : entries) {
HashMap<String, String> map = new HashMap<String, String>(3);
Presence presence = roster.getPresence(entry.getUser());
map.put(ROASTER_KEY, entry.getName());
map.put(ROASTER_BARE_JID, entry.getUser());
map.put(PRESENCE_TYPE, presence.isAvailable() == true ? PRESENCE_ONLINE : PRESENCE_OFFLINE);
maps.add(map);
}
if (maps != null && maps.size() > 0 && callback != null) {
callback.onSuccess(maps);
} else {
callback.onError(new Throwable());
}
}