本文:openfire:4.0.1,Smack:4.1.6
OpenFire与Smack下载:http://www.igniterealtime.org/index.jsp
SmackAPI:http://www.igniterealtime.org/projects/index.jsp
Smack开发指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/
Smack源码(GitHub地址):https://github.com/igniterealtime/Smack
Smack开发指南写的很简单只描述了一些基本功能,本文记录我在开发过程中遇到的开发指南上没有的问题。
XMPP官网:http://www.xmpp.org/
Android怎么导入Smack的jar包(请参考Android部分):https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide
这里有一个老外回答的怎么在Android上使用Smack:http://stackoverflow.com/questions/26965506/how-to-use-smack-4-1-in-android
两个对学习XMPP有帮助的博客:
1、http://blog.csdn.net/lnb333666/article/list/1
2、http://blog.csdn.net/h7870181?viewmode=contents
这两个博主都是基于ASmack开发的,我是基于Smack开发的不过有很多代码通用,很有借鉴意义。
1、登录后立马获取Roster一般是获取不到的,你可以这么做:
mRoster.addRosterLoadedListener(new RosterLoadedListener() {
@Override
public void onRosterLoaded(Roster arg0) {
getAllRoster();
}
});
监听所有Roster加载完成后进行获取。
2、添加好友:
private void addUser(String userId){
if(userId.indexOf("@你服务器的域名或IP")==-1){
userId=userId+"@你服务器的域名或IP";
}
mRoster.addRosterListener(new RosterListener(){
@Override
public void entriesAdded(Collection<String> arg0) {
}
@Override
public void entriesDeleted(Collection<String> arg0) {
}
@Override
public void entriesUpdated(Collection<String> arg0) {
}
@Override
public void presenceChanged(Presence arg0) {
}
});
try {
mRoster.createEntry(userId, userId, new String[]{"好友分组名"});
} catch (NotLoggedInException e) {
e.printStackTrace();
} catch (NoResponseException e) {
e.printStackTrace();
} catch (XMPPErrorException e) {
e.printStackTrace();
} catch (NotConnectedException e) {
e.printStackTrace();
}
}
3、监听别人对你添加好友(也可以监听别人是否响应你的添加请求,在4.1.6PacketListener和PacketTypeFilter提示以过期):
public void addSubscriptionListener() {
PacketTypeFilter packetFilter = new PacketTypeFilter(Presence.class);
PacketListener subscribeListener = new PacketListener(){
@Override
public void processPacket(Stanza stanza) throws NotConnectedException {
Looper.prepare();
final Presence presence = (Presence)stanza;
if (presence.getType().equals(Presence.Type.subscribe)) {
Toast.makeText(MainActivity.this, stanza.getFrom()+"请求添加你为好友",
Toast.LENGTH_SHORT).show();
} else if (presence.getType().equals(Presence.Type.unsubscribe)) {
Toast.makeText(MainActivity.this, stanza.getFrom()+"删除了你",
Toast.LENGTH_SHORT).show();
}
Looper.loop();
}
};
mXMPPTCPConnection.addPacketListener(subscribeListener, packetFilter);
}
4、添加好友分组:
public static boolean addGroup(Roster roster, String groupName) {
try {
roster.createGroup(groupName)