【发布时间】:2011-06-07 15:32:23
【问题描述】:
我可以通过 Smack API 在我的好友列表中获取在线用户吗?有可能吗?
我正在开发可以在用户之间进行聊天的应用。我已经成功创建了聊天应用程序示例,只需输入朋友的姓名并发送聊天,但现在我想要在线朋友列表。
【问题讨论】:
我可以通过 Smack API 在我的好友列表中获取在线用户吗?有可能吗?
我正在开发可以在用户之间进行聊天的应用。我已经成功创建了聊天应用程序示例,只需输入朋友的姓名并发送聊天,但现在我想要在线朋友列表。
【问题讨论】:
Roster roster = xmppConnection.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
Presence presence;
for(RosterEntry entry : entries) {
presence = roster.getPresence(entry.getUser());
System.out.println(entry.getUser());
System.out.println(presence.getType().name());
System.out.println(presence.getStatus());
}
【讨论】:
使用presence.getMode() 方法获取用户模式。
模式为枚举,其值可以是聊天、可用、离开、xa、dnd。
【讨论】:
Presence presence = roster.getPresence("tom@jabber.org");
if (presence.getType() == Presence.Type.AVAILABLE) {
// Tom is online...
}
来自this link的参考
【讨论】:
XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() {
@Override
public void connectionCreated(Connection arg0) {
Log.i(TAG, "receive xmpp connection : " + arg0);
connection = arg0;
roster = arg0.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
Presence presence;
Log.e(TAG, "user count" + entries.size());
for (RosterEntry entry : entries) {
presence = roster.getPresence(entry.getUser());
Log.i(TAG, "" + entry.getUser());
Log.i(TAG, "" + presence.getType().name());
Log.i(TAG, "" + presence.getStatus());
}
}
});
所以在您的程序开始时注册 XMPPConnection 监听器,通常需要几秒钟来接收连接对象。 但是只有当你只使用 creatEntry 时它才会起作用,只有在这种情况下 rooster 才能看到那些创建的用户。
要使用名册创建条目,请使用下一个代码:
try {
rooster.createEntry("name", "user_id", null);
} catch (XMPPException e) {
e.printStackTrace();
}
我没有使用任何组,并且成功在第二台设备上看到用户。
【讨论】:
smackAndroid = SmackAndroid.init(this);
XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() {
@Override
public void connectionCreated(XMPPConnection connection) {
Log.i("hello", "receive xmpp connection : " + connection);
roster = connection.getRoster();
try {
roster.createEntry("2868254", "hello", null);
} catch (XMPPException e) {
e.printStackTrace();
} catch (NotLoggedInException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoResponseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotConnectedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
【讨论】: