openfire Smack 4.1.8 and 4.2.0-beta2 添加好友请求确认
首先说一下我踩的坑,以前的方法过期,会有用户名过长无法接收,无法过滤,丢失请求,发送无效等等问题,博客一大堆不更新,都是老版本的坑,这里直接上传以前的过期示意图
请大家不要再写以下的代码
老版本addPacketListener
老版本listener如下:
现在我的包是
Smack 4.1.8 and 4.2.0-beta2其实是一样的,我这里用的不是后者测试版,选的前者4.1.8
compile 'org.igniterealtime.smack:smack-android-extensions:4.1.8'
compile 'org.igniterealtime.smack:smack-tcp:4.1.8'
先直接上传最新写法:
新版本add监听
//条件过滤器
AndFilter filter = new AndFilter(new StanzaTypeFilter(Presence.class));
//添加监听
mConnection.addAsyncStanzaListener(packetListener, filter);
新版本listener
static StanzaListener packetListener = new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
if (packet instanceof Presence) {
Presence presence = (Presence) packet;
String fromId = presence.getFrom();
String from = presence.getFrom().split("@")[0];//我这里只为了打印去掉了后缀
if (presence.getType().equals(Presence.Type.subscribe)) {
YbLogUtil.d("yangbinnew请求添加好友" + from);
} else if (presence.getType().equals(Presence.Type.subscribed)) {//对方同意订阅
YbLogUtil.d("yangbinnew同意订阅" + from);
} else if (presence.getType().equals(Presence.Type.unsubscribe)) {//取消订阅
YbLogUtil.d("yangbinnew取消订阅" + from);
} else if (presence.getType().equals(Presence.Type.unsubscribed)) {//拒绝订阅
YbLogUtil.d("yangbinnew拒绝订阅" + from);
} else if (presence.getType().equals(Presence.Type.unavailable)) {//离线
YbLogUtil.d("yangbinnew离线" + from);
} else if (presence.getType().equals(Presence.Type.available)) {//上线
YbLogUtil.d("yangbinnew上线" + from);
}
}
}
};
演示请求效果
处理好友请求
同意(或者拒绝)
Presence pres = new Presence(Presence.Type.subscribed);//拒绝unsubscribed
pres.setTo(fromId);
try {
XMPPConnectionService.getmConnection().sendStanza(pres);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
添加好友
//添加好友
Roster roster = Roster.getInstanceFor(getmConnection());
roster.createEntry(friendName.trim() + "@" + Constant.XMPP_HOST, name, new String[]{"Friends"});
删除好友
Roster roster = Roster.getInstanceFor(getmConnection());
RosterEntry entry = roster.getEntry(user);
roster.removeEntry(entry);
根据自己需求
有同步和异步,上一个则一次性无序全部给你,下一个则一个个给你
这里还有一个好友动态监听,比上面简单些,但只有Added的好友,若没有好友权限添加,则可以用这个,若需要手动确认添加好友,则按上面所示
RosterListener listener =new RosterListener() {
@Override
public void entriesAdded(Collection<String> addresses) {
}
@Override
public void entriesUpdated(Collection<String> addresses) {
}
@Override
public void entriesDeleted(Collection<String> addresses) {
}
@Override
public void presenceChanged(Presence presence) {
}
};
**qq:1250211588,有任何问题,可以咨询我,谢谢