Android 获取花名册好友以及修改昵称

Android 获取花名册好友以及修改昵称

本文基于smack4.1.9进行实现

通过Roster获取花名册好友列表总共有两种方法

第一种方法,适用于应用启动尚未完成的时候

通过roster.addRosterLoadedListener去获取花名册好友。此时应用尚未启动完成,登录鉴权回调尚未执行,必须通过监控的方式获取。而此时的RosterEntry entry实体类中的getName就是获取好友昵称,getType为both时代表双方互加了好友。

  /**
       * 获取xmpp好友列表及昵称
       *
       */
    private void getFriendList() {
    
        final XmppConfig connection = XmppConfig.getInstance(this);
        if (connection==null) {return ;}
        final List<RosterEntry> entryList1 = new ArrayList<>();
        try {
            Roster roster = Roster.getInstanceFor(connection);
            //由于应用刚启动,尚未加载完成,必须通过监听来获取花名册好友
            roster.addRosterLoadedListener(new RosterLoadedListener() {
                @Override
                public void onRosterLoaded(Roster roster1) {
                    //这是获取到的花名册好友列表,type代表好友的类型,name代表好友昵称
                    Collection<RosterEntry> entries =  roster1.getEntries();
                    for (RosterEntry entry : entries) {
                        if("both".equals(entry.getType().toString())){
                            if (entry.getName()!=null&&!Util.isValidUUID(entry.getName())){
                                entryList1.add(entry);
                            }
                        }
                    }
                    if (chatUserNickList.size()>0&&entryList1.size()>0){
                        for (int i=0,index=chatUserNickList.size();i<index;i++){
                                for (int j = 0, indexJ = entryList1.size(); j < indexJ; j++) {
                                    if (chatUserNickList.get(i).getUserId().equals(entryList1.get(j).getUser().split("@")[0])) {
                                        chatUserNickList.get(i).setMemoName(entryList1.get(j).getName());
                                        dbManager.updateMemoNameByChatUser(chatUserNickList.get(i));
                                        break;
                                    }
                                } 
                        }
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
第二种方法,适用于应用启动完成后

直接通过Roster.getInstanceFor(connection).getEntries();获取到花名册好友列表

  /**
     * 获取xmpp好友列表及昵称
     *
     */
    private void getFriendList(List<ChatUser> chatUsers) {
    
        XmppConfig connection = XmppConfig.getInstance(mContext);
        if (connection==null) {return ;}
        List<RosterEntry> entryList1 = new ArrayList<>();
        try {
            //应用启动完成,不用监听直接获取好友列表,type代表好友类型,name代表好友昵称
            Collection<RosterEntry> entries = Roster.getInstanceFor(connection).getEntries();
            for (RosterEntry entry : entries) {
                if ("both".equals(entry.getType().toString())) {
                    if (entry.getName() != null && !Util.isValidUUID(entry.getName())) {
                        entryList1.add(entry);
                    }
                }
            }
            if (chatUsers.size()>0&&entryList1.size()>0){
                for (int i=0,index=chatUsers.size();i<index;i++){
                        for (int j = 0, indexJ = entryList1.size(); j < indexJ; j++) {
                            if (chatUsers.get(i).getUserId().equals(entryList1.get(j).getUser().split("@")[0])) {
                                chatUsers.get(i).setMemoName(entryList1.get(j).getName());
                                dbManager.updateMemoNameByChatUser(chatUsers.get(i)); 
                                break;
                            }
                        }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

修改好友昵称,并保存到服务器数据库,这样就算应用卸载了重装也不会删除

第一步,参考:http://wiki.jabbercn.org/RFC6121 来拼接IQ格式,如下:
 <iq from='juliet@example.com/balcony'
           id='di43b2x9'
           type='set'>
         <query xmlns='jabber:iq:roster'>
           <item jid='romeo@example.net'
                 name='Romeo'>
           </item>
         </query>
       </iq>

根据上面的IQ格式,我自己创建了一个NickNameIQ 类,继承IQ。

  public class NickNameIQ extends IQ {
    
        private String jid;
        private String nickName;
    
        public NickNameIQ(String childElementName, String childElementNamespace, String jid,String nickName) {
            super(childElementName, childElementNamespace);
            this.jid = jid;
            this.nickName = nickName;
        }
    
        @Override
        protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
            xml.rightAngleBracket();
            xml.append("<item jid=\'"+jid+"\' name=\'"+nickName+"\'>"+"</item>");
            return xml;
        }
    }
第二步,传入修改的好友新昵称,直接提交
/**
 * 修改好友昵称
 */
private void changNickName(final String getMemoName) {

    String loginId = AppPrefs.get(this).getChatLogn().UserId;
    NickNameIQ nickNameIQ = new NickNameIQ("query","jabber:iq:roster",userId+"@win-arbj87ei5km",getMemoName);
    nickNameIQ.setType(IQ.Type.set);
    nickNameIQ.setFrom(loginId+"@conference.win-arbj87ei5km/"+userId);
    try {
        XmppConfig.getInstance(mContext).sendStanza(nickNameIQ);
    } catch (SmackException.NotConnectedException e) {
        e.printStackTrace();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值