我正在使用smack api。
Presence presencePacket = new Presence(Presence.Type.subscribe);
presencePacket.setTo("dhmohn@example.com");
conn1.sendPacket(presencePacket);
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
Roster roster=conn1.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries) {
System.out.println(roster.getPresence(entry.getUser()));
}
在上面的代码roster.getPresence(entry.getUser())
中,状态为unavailable
此外,我有以下问题:
dhmohn@example.com
是用户名为danmorgan
的用户的电子邮件ID。我使用的是正确的 jid 吗?danmorgan@saint-pc
。请注意,在 openfire服务器,为用户设置订阅模式。
答案 0 :(得分:1)
Presence presence = new Presence(Presence.Type.available); connection.sendPacket(存在);
Roster roster = connection.getRoster();
roster.addRosterListener(new RosterListener() {
@Override
public void presenceChanged(Presence presence) {
// TODO Auto-generated method stub
String user = presence.getFrom();
// Presence bestPresence = roster.getPresence(user);
Log.e("User Presence--------->****-->",
"User Name-----" + user
+ "Online or Offline ---->"
+ presence.isAvailable());
}
@Override
public void entriesUpdated(Collection<String> arg0) {
// TODO Auto-generated method stub
}
@Override
public void entriesDeleted(Collection<String> arg0) {
// TODO Auto-generated method stub
}
@Override
public void entriesAdded(Collection<String> arg0) {
// TODO Auto-generated method stub
}
});
此处您可以在进行离线时更新用户状态,并在状态更改时联机。
答案 1 :(得分:1)
JID 是不可或缺的部分。
始终使用 JID 登录。 JID 是用户名和服务器 名称的组合。 因此,在我的情况下,JID将是username @ server-name,即 dhmohn @ saint-pc ,因为用户名是 dhmohn 和服务器名称是 saint-pc 。
请注意,如果您使用以下代码登录,那么您的名单将始终为空:
conn1.login("dhmohn", "Dhmohn123");
相反,始终使用jabber ID登录:
conn1.login("dhmohn@saint-pc", "Dhmohn123");
登录后,让线程进入睡眠状态10秒钟。后来取了名单。
可以在 Openfire的管理控制台中找到服务器名称:
server tab ->server manager->server informaton->server properties