XMPP客户端库Smack 4.0.6版开发之六
作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs
五、名单Roster和在线状态Presence
名单可以让你跟踪其他用户是否在线,而且名单可以让你把用户组织到群组,比如朋友群或工作群。而其它的即时通信IM系统则把名单Roster视为好友列表、联系人列表等等。
1、名单条目
名单中的每一个用户都由RosterEntry来表示,它包括:
1)一个XMPP地址(比如”jsmith@example.com”)
2)你为用户编写的备注姓名(比如”Joe”)
3)名单中的群列表。如果名单的条目不属于任何群组,那么它被称为"unfiledentry"。
下面的代码片段会打印名单中所有的条目:
Rosterroster = connection.getRoster();
Collection<RosterEntry>entries = roster.getEntries();
for(RosterEntryentry : entries){
System.out.println(entry);
}
还有获取单个条目的方法、获取"unfiledentry"的方法,获取一个群或所有群的方法。
2、在线状态
名单中的每个条目都有一个与之相关的在线状态。Roster.getPresence(Stringuser)方法会返回一个表示用户是否在线的Presence对象或者为空。为空是你还没有订阅用户是否在线的返回。
注意:通常情况下,在线状态的订阅总是绑定到名单中的用户,但这并不适应所有的情况。
一个用户的在线状态要么是在线,要么是离线。当用户在线时,他们的在线状态还可以包含扩展的信息,比如用户当前正在做什么,用户是否愿意被打扰等等。具体参考Presence类。
3、监听名单Roster和在线状态Presence的改变
Roster类的典型应用场景是以树状结构显示用户群和列表,并且用户列表中包含用户是否在线的状态。比如,参考下图所示的一个ExodusXMPP客户端的Roster。
在线状态的信息可能会经常变化,Roster条目也可能经常修改或删除。要监听Roster和Presence数据的变化,你应该使用RosterListener。要得到Roster改变的所有提醒,那么必须在登录XMPP服务器之前注册RosterListener。下面的代码片段注册了一个Roster的RosterListener,它能够在标准输出中打印任何Presence的改变。一个标准的客户端可以使用类似的代码用变化的信息来更新Roster界面。
Rosterroster = con.getRoster();
roster.addRosterListener(newRosterListener(){
// 忽略事件public void entriesAdded(Collection<String> addresses){}
public void entriesDeleted(Collection<String>addresses){}
public voidentriesUpdated(Collection<String> addresses){}
public void presenceChanged(Presencepresence){
System.out.println(“Presencechanged: “+ presence.getFrom() + “ “ + presence);
}
});
4、添加Entries到Roster
Roster和Presence使用一种基于权限的模型,用户必须得到其他人的许可才能把这些人添加到Roster。这样可以保护用户的隐私,确保了只有获得同意的用户才能查看到他们的Presence信息。因此,当你想添加某个用户到你的Roster中,必须得到该用户接受你的请求才可以。
如果有用户请求订阅你的在线状态Presence,这个用户必须先把你添加到他的Roster,因此他会发起请求,你必须选择接受或拒绝该请求。Smack通过以下三种方式来处理Presence的预订请求:
1)自动接受所有Presence的预订请求
2)自动拒绝所有Presence的预订请求
3)手动处理每一个Presence预订请求
这三种方式可以通过Roster.setSubscriptionMode(intsubscriptionMode)方法来设置请求的处理方式。简单的客户端通常使用第一种自动方式处理预订请求,而功能比较全的客户端应该选择第三种手动处理请求的方式,让终端用户自行决定是接受请求或是拒绝请求。如果使用手动方式,应该注册一个PacketListener来监听Presence.Type.SUBSCRIBE类型的Presence包。