即时通讯-openfire、smack、spark(三)
添加好友、删除好友、好友列表、添加好友及被添加监听
这里向大家介绍关于好友管理的API
- Roster(花名册):主要用到的就是以下三个方法,当然更多的API我还没有用到,后续如果用到的话会补充到该博客中。
/** * 添加好友 * * @param user 即为 jid 唯一标识 * @param name 名称:昵称 or 备注 * @param groups 分组:想要添加到哪个分组 * / createEntry(BareJid user, String name, String[] groups) /** * 删除好友 */ removeEntry(RosterEntry entry); /** * 获取好友列表 */ getEntries();
- StanzaListener(房间监听器):每次状态改变时都会回调
processStanza(Stanza packet)
这个方法。 - Stanza:可以通过如下Type类型来进行区分好友状态
available,unavailable,subscribe, subscribed, unsubscribe, unsubscribed,error, probe;
添加好友
添加好友代码
/**
* 添加好友
*
* @param user 即为 jid 唯一标识
* @param name 名称:昵称 or 备注
* @param groups 分组:想要添加到哪个分组
* @return
*/
public boolean addFriend(String user, String name, String[] groups) {
try {
getRoster().createEntry(Objects.requireNonNull(Utils.stringToJid(user)), name, groups);
Log.e(TAG, "添加成功");
return true;
} catch (XMPPException | SmackException | InterruptedException xe) {
xe.printStackTrace();
Log.e(TAG, "添加失败");
}
return false;
}
删除好友
删除好友代码
```
/**
* 删除好友
*/
public boolean deleteFriend(BareJid jid) {
try {
Roster roster = getRoster();
RosterEntry entry = roster.getEntry(jid);
if (entry != null) {
roster.removeEntry(entry);
Log.e(TAG, "删除成功");
return true;
}
} catch (XMPPException | SmackException | InterruptedException xe) {
xe.printStackTrace();
Log.e(TAG, "删除失败");
}
return false;
}
```
好友列表
获取好友列表
/**
* 获取好友列表
*
* @return 好友列表
*/
public List<RosterEntry> getFriends() {
Collection<RosterEntry> entries = Roster.getInstanceFor(getConnection()).getEntries();
return new ArrayList<>(entries);
}
添加好友及被添加监听
好友实体类
public class AddFriendEntity implements Parcelable {
//对方名称
private java.lang.String toName;
//对方jid
private Jid toJid;
//主动添加好友的名称
private java.lang.String fromName;
//主动添加好友的jid
private Jid fromJid;
//状态 1: 同意,2: 取消,3: 拒绝,4: 收到请求
private int state;
}
监听器
这里说下,如果想要通知Fragment和Activity进行刷新UI,可以采用观察者模式(Observer),在最后会给出观察者(observer)的相关代码。
public class XMAddFriendListener implements StanzaListener {
public static final String TAG = XMAddFriendListener.class.getSimpleName();
private int count;
private AddFriendEntity addFriendEntity = new AddFriendEntity();
@Override
public void processStanza(Stanza stanza) {
Log.e(TAG, "stanza.toXML():" + stanza.toXML());
if (stanza instanceof Presence) {
Presence presence = (Presence) stanza;
switch (presence.getType()) {
case subscribe://收到添加请求
Log.e(TAG, "收到添加请求");
//A用户多次请求添加B用户视为一次请求。
if (!presence.getFrom().equals(addFriendEntity.getFromJid())) {
count++;
addFriendEntity.setFromJid();//发送方Jid
addFriendEntity.setFromName();//发送方名称
addFriendEntity.setToJid();//接收方jid
addFriendEntity.setToName();//接受方名称
addFriendEntity.setState(4);//TODO 后期优化为枚举,增加阅读性
observable.setEntity(addFriendEntity, count);
}
break;
case subscribed://同意订阅(对方同意添加好友)
Log.e(TAG, "对方同意添加好友");
addFriendEntity.setState(1);
observable.setEntity(addFriendEntity, count);
break;
case unsubscribe://取消订阅
addFriendEntity.setState(3);
observable.setEntity(addFriendEntity, count);
break;
case unsubscribed://拒绝订阅
// addFriendEntity.setState(3);
// observable.setEntity(addFriendEntity, count);
System.out.println("拒绝订阅");
break;
case unavailable:
System.out.println("好友下线!");
break;
case available:
System.out.println("好友上线!");
break;
case error:
System.out.println("发生错误");
break;
case probe:
break;
default:
break;
}
}
}
}
被观察者
/**
* @author Hexl
* @desc 被观察者
* @date 2018/10/19
*/
public class FriendObservable extends Observable {
private AddFriendEntity entity;
private int friendNum;
public AddFriendEntity getEntity() {
return entity;
}
public int getFriendNum() {
return friendNum;
}
public void setEntity(AddFriendEntity entity, int friendNum) {
this.entity = entity;
this.friendNum = friendNum;
setChanged();
notifyObservers(entity);
}
}
观察者
/**
* @author Hexl
* @desc 观察者
* @date 2018/10/19
*/
public interface FriendObserver extends Observer {
@Override
void update(Observable addFriend, Object arg);
}
增加观察者后的监听器代码
最后建议大家可以在Activity
或Fragment
中的onCreate
方法调用addObserver(Observer observer)
然后在onDestroy
方法调用removeObserver(Observer observer)
不然会使内存导致内存泄漏。
/**
* @author Hexl
* @desc 添加好友监听
* @date 2018/10/27
*/
public class XMAddFriendListener implements StanzaListener {
public static final String TAG = XMAddFriendListener.class.getSimpleName();
public static FriendObservable observable = new FriendObservable();
public static void addObserver(Observer observer) {
observable.addObserver(observer);
}
public static void removeObserver(Observer observer) {
observable.deleteObserver(observer);
}
private int count;
private AddFriendEntity addFriendEntity = new AddFriendEntity();
@Override
public void processStanza(Stanza stanza) {
Log.e(TAG, "stanza.toXML():" + stanza.toXML());
if (stanza instanceof Presence) {
Presence presence = (Presence) stanza;
switch (presence.getType()) {
case subscribe://收到添加请求
Log.e(TAG, "收到添加请求");
//A用户多次请求添加B用户视为一次请求。
if (!presence.getFrom().equals(addFriendEntity.getFromJid())) {
count++;
addFriendEntity.setFromJid();//发送方Jid
addFriendEntity.setFromName();//发送方名称
addFriendEntity.setToJid(presence.getTo());//接收方jid
addFriendEntity.setToName();//接受方名称
addFriendEntity.setState();//TODO 后期优化为枚举,增加阅读性
observable.setEntity(addFriendEntity, count);
}
break;
case subscribed://同意订阅(对方同意添加好友)
Log.e(TAG, "对方同意添加好友");
addFriendEntity.setState(1);
observable.setEntity(addFriendEntity, count);
break;
case unsubscribe://取消订阅
addFriendEntity.setState(3);
observable.setEntity(addFriendEntity, count);
break;
case unsubscribed://拒绝订阅
// addFriendEntity.setState(3);
// observable.setEntity(addFriendEntity, count);
System.out.println("拒绝订阅");
break;
case unavailable:
System.out.println("好友下线!");
break;
case available:
System.out.println("好友上线!");
break;
case error:
System.out.println("发生错误");
break;
case probe:
break;
default:
break;
}
}
}
}