即时通讯-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);
}

增加观察者后的监听器代码
最后建议大家可以在ActivityFragment中的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;
            }
        }
    }
}

源码不在篇尾,哈哈哈。请移步到该系列第二篇文章寻找。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值