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();
}
}