從消息擴展中獲取昵稱和頭像
昵稱和頭像的獲榷獭:把用戶基本的昵稱和頭像的URL放到消息的擴展中,通過消息傳遞給接收方荷逞,當收到一條消息時媒咳,則能通過消息的擴展得到發(fā)送者的昵稱和頭像URL,然后保存到本地數(shù)據(jù)庫和緩存种远。當顯示昵稱和頭像時涩澡,請從本地或者緩存中讀取,不要直接從消息中把賦值拿給界面(否則當用戶昵稱改變后坠敷,同一個人會顯示不同的昵稱)妙同。
昵稱和頭像的更新:當擴展消息中的昵稱和頭像URI與當前本地數(shù)據(jù)庫和緩存中的相應數(shù)據(jù)不同的時候射富,需要把新的昵稱保存到本地數(shù)據(jù)庫和緩存,并下載新的頭像并保存到本地數(shù)據(jù)庫和緩存粥帚。
1胰耗、在登錄的時候,把自己登錄成功時后臺返回的信息保存到sharedpreferences中芒涡,需要包含需要的頭像和昵稱柴灯。
//保存到sharedpreferences
SPUtils.setValueToPrefrences("name", loginBean.getName());
SPUtils.setValueToPrefrences("logoUrl", loginBean.getLogoUrl());
// 將自己服務器返回的環(huán)信賬號、昵稱和頭像URL設置到幫助類中费尽。
DemoHelper.getInstance().getUserProfileManager().updateCurrentUserNickName(loginBean.getName());
DemoHelper.getInstance().getUserProfileManager().setCurrentUserAvatar(loginBean.getLogoUrl());
DemoHelper.getInstance().setCurrentUserName(loginUser.getHxId()); // 環(huán)信Id
2.ChatFragment類中有一個擴展屬性的說明赠群,沒錯,就是這個方法旱幼,把你要發(fā)送的內(nèi)容盡情的發(fā)送吧乎串,現(xiàn)附上發(fā)送頭像和昵稱的代碼:
@Override
public void onSetMessageAttributes(EMMessage message) {
if (isRobot) {
// 設置消息擴展屬性
message.setAttribute("em_robot_message", isRobot);
}
// 通過擴展屬性,將userPic和userName發(fā)送出去速警。
String userPic = SPUtils.getValueFromPrefrences("logoUrl", "");
if (!TextUtils.isEmpty(userPic)) {
message.setAttribute("userPic", userPic);
}
String userName = SPUtils.getValueFromPrefrences("name", "");
if (!TextUtils.isEmpty(userName)) {
message.setAttribute("userName", userName);
}
}
3、發(fā)送完成后鸯两,肯定需要一個接收闷旧,其實demo中的廣播已經(jīng)接收好了,那么我們跟隨著廣播的腳步钧唐,來到DemoHelper這個類忙灼,初次看這個類,都是云一樣的感覺钝侠,經(jīng)過一番查找该园,發(fā)現(xiàn)有個onMessageReceived的方法,并且還有注釋“全局監(jiān)聽”帅韧,趕緊開工里初,試試接收吧,可以自己打一下log出來看是不是拿到了我們要的忽舟。并且照著demoHelper中的保存方法双妨,將接收到的內(nèi)容保存起來。
@Override
public void onMessageReceived(List<EMMessage> messages) {
for (EMMessage message : messages) {
message.setMsgTime(System.currentTimeMillis());
//************接收并處理擴展消息***********************
String userName = message.getStringAttribute("userName", "");
String userPic = message.getStringAttribute("userPic", "");
String hxIdFrom = message.getFrom();
EaseUser easeUser = new EaseUser(hxIdFrom);
easeUser.setAvatar(userPic);
easeUser.setNick(userName);
// 存入內(nèi)存
getContactList();
contactList.put(hxIdFrom, easeUser);
// 存入db
UserDao dao = new UserDao(MainApplication.getContext());
List<EaseUser> users = new ArrayList<EaseUser>();
users.add(easeUser);
dao.saveContactList(users);
getModel().setContactSynced(true);
// 通知listeners聯(lián)系人同步完畢
notifyContactsSyncListener(true);
if (isGroupsSyncedWithServer()) {
notifyForRecevingEvents();
}
// ******************擴展信息處理完成**********************
EMLog.d(TAG, "onMessageReceived id : " + message.getMsgId());
// 應用在后臺叮阅,不需要刷新UI,通知欄提示新消息
if (!easeUI.hasForegroundActivies()) {
getNotifier().onNewMsg(message);
}
}
}
5刁品、信息都收到了,就差最后一步就可以顯示了浩姥。那在哪里進行顯示呢挑随?還是在DemoHelper中,找到getUserInfo方法勒叠,代碼如下:
private EaseUser getUserInfo(String hxId) {
// 獲取user信息兜挨,demo是從內(nèi)存的好友列表里獲取膏孟,
// 實際開發(fā)中,可能還需要從服務器獲取用戶信息,
// 從服務器獲取的數(shù)據(jù)暑劝,最好緩存起來骆莹,避免頻繁的網(wǎng)絡請求
if (hxId.equals(EMClient.getInstance().getCurrentUser())) {
EaseUser currentUserInfo = getUserProfileManager().getCurrentUserInfo();
return currentUserInfo;
}
EaseUser easeUser;
if (contactList != null && contactList.containsKey(hxId)) {
} else { // 如果內(nèi)存中沒有,則將本地數(shù)據(jù)庫中的取出到內(nèi)存中担猛。
getContactList();
}
// // TODO 獲取不在好友列表里的群成員具體信息幕垦,即陌生人信息,demo未實現(xiàn)
// if (user == null && getRobotList() != null) {
// user = getRobotList().get(hxId);
// }
easeUser = contactList.get(hxId);
if(easeUser == null){
easeUser = new EaseUser(hxId);
} else {
if(TextUtils.isEmpty(easeUser.getNick())){ // 如果名字為空傅联,則顯示環(huán)信號碼
easeUser.setNick(easeUser.getUsername());
}
}
return easeUser;
}