環信頭像和暱稱的顯示–基於Easeui實現
本人是一個在校大學生,參加比賽使用到環信,特總結並記錄環信頭像和暱稱的顯示方法(受盡折磨)。
1.首先你需要在登錄成功時,將自己的的暱稱和頭像保存到本地,用於發送消息時,將自己的暱稱和頭像發給對方。
SpUtils.getInstance().save("userNick",userInfo.getNick());
SpUtils.getInstance().save("userAvatar",userInfo.getImage());
其中,SpUtils是一個工具類,利用SharedPreferences緩存信息。
2.然後在easeChatFragment的聊天監聽中,在onSetMessageAttributes方法中,將自己的暱稱和頭像作爲擴展消息發送。(我的聊天的fragment是自定義的,沒有繼承EaseChatFragment,所以需要單獨爲定義的easeChatFragment設置監聽,重寫回調方法,再替換掉我的fragment;如果你是繼承的EaseChatFragment,便可以直接在Fragment類中重寫onSetMessageAttributes回調方法)
easeChatFragment.setChatFragmentListener(new EaseChatFragment.EaseChatFragmentHelper() {
@Override
public void onSetMessageAttributes(EMMessage message) {
//設置要發送擴展消息用戶暱稱
message.setAttribute(Constant.ChatUserNick, SpUtils.getInstance().getString("userNick",""));
//設置要發送擴展消息用戶頭像
message.setAttribute(Constant.ChatUserPic, SpUtils.getInstance().getString("userAvatar",""));
}
}
3.接着準備一個基於頭像和暱稱處理顯示的類,如下:
public class HxEaseuiHelper {
private static HxEaseuiHelper instance = null;
protected EMMessageListener messageListener = null;
private Context mContext;
private String username;
private EaseUI easeUI;
private Map<String, EaseUser> contactList;
public synchronized static HxEaseuiHelper getInstance() {
if (instance == null) {
instance = new HxEaseuiHelper();
}
return instance;
}
public void init(Context context) {
EMOptions options = initChatOptions();
//use default options if options is null
mContext = context;
//獲取easeui實例
easeUI = EaseUI.getInstance();
//初始化easeui
easeUI.init(mContext,options);
setEaseUIProviders();
//設置全局監聽
setGlobalListeners();
//在做打包混淆時,關閉debug模式,避免消耗不必要的資源
EMClient.getInstance().setDebugMode(true);
}
private EMOptions initChatOptions(){
EMOptions options = new EMOptions();
options.setAcceptInvitationAlways(false);
options.setAutoAcceptGroupInvitation(false);
return options;
}
protected void setEaseUIProviders() {
EaseUI easeUI1 = EaseUI.getInstance();
// set profile provider if you want easeUI to handle avatar and nickname
easeUI1.setUserProfileProvider(new EaseUI.EaseUserProfileProvider() {
@Override
public EaseUser getUser(String username) {
return getUserInfo(username);
}
});
}
public EaseUser getUserInfo(String username) {
//獲取 EaseUser實例, 這裏從內存中讀取
//如果你是從服務器中讀讀取到的,最好在本地進行緩存
EaseUser user = null;
if(username == null) {
Toast.makeText(mContext, username+"", Toast.LENGTH_SHORT).show();
return null;
}
//如果用戶是本人,就設置自己的頭像
if(username.equals(EMClient.getInstance().getCurrentUser())){
user=new EaseUser(username);
user.setAvatar((String) SpUtils.getInstance().getString("userAvatar",""));
user.setNick((String)SpUtils.getInstance().getString("userName",""));
return user;
}
//收到別人的消息,設置別人的頭像
if (contactList!=null && contactList.containsKey(username)){
user=contactList.get(username);
}else { //如果內存中沒有,則將本地數據庫中的取出到內存中
contactList=getContactList();
user=contactList.get(username);
}
//如果用戶不是你的聯繫人,則進行初始化
if(user == null){
user = new EaseUser(username);
EaseCommonUtils.setUserInitialLetter(user);
}else {
if (TextUtils.isEmpty(user.getAvatar())){//如果名字爲空,則顯示環信號碼
user.setNick(user.getUsername());
}
}
return user;
}
/**
*獲取所有的聯繫人信息
*
* @return
*/
public Map<String, EaseUser> getContactList() {
if (isLoggedIn() && contactList == null) {
contactList = new HashMap<>();
//UserInfo是你自己的用戶的bean類(定義的用戶類)
//通過本地數據庫獲取自己的聯繫人信息
List<UserInfo> users = Model.getInstance().getDBManager().getContactTableDao().getContacts();
for (UserInfo userInfo: users){
EaseUser easeUser = new EaseUser(userInfo.getHxid());
easeUser.setNick(userInfo.getName());
easeUser.setAvatar(userInfo.getImage());
contactList.put(userInfo.getHxid(),easeUser);
}
}
// return a empty non-null object to avoid app crash
if(contactList == null){
return new Hashtable<String, EaseUser>();
}
return contactList;
}
/**
* if ever logged in
*
* @return
*/
public boolean isLoggedIn() {
return EMClient.getInstance().isLoggedInBefore();
}
/**
* set global listener
*/
protected void setGlobalListeners(){
registerMessageListener();
}
/**
* Global listener
* If this event already handled by an activity, you don't need handle it again
* activityList.size() <= 0 means all activities already in background or not in Activity Stack
*/
protected void registerMessageListener() {
messageListener = new EMMessageListener() {
private BroadcastReceiver broadCastReceiver = null;
@Override
public void onMessageReceived(List<EMMessage> messages) {
for (EMMessage message : messages) {
EMLog.d(TAG, "onMessageReceived id : " + message.getMsgId());
//接收並處理擴展消息
String userName=message.getStringAttribute(Constant.ChatUserNick,"");
String userPic=message.getStringAttribute(Constant.ChatUserPic,"");
String hxIdFrom=message.getFrom();
EaseUser easeUser=new EaseUser(hxIdFrom);
easeUser.setAvatar(userPic);
easeUser.setNick(userName);
//存入內存
getContactList();
contactList.put(hxIdFrom,easeUser);
UserInfo userInfo = new UserInfo(hxIdFrom);
userInfo.setName(userName);
userInfo.setImage(userPic);
//存入db,將聯繫人信息存到本地數據庫,我是爲本手機上的用戶都單獨創建自己的聯繫人數據庫
ContactTableDao dao = Model.getInstance().getDBManager().getContactTableDao();
List<UserInfo> users=new ArrayList<UserInfo>();
users.add(userInfo);
dao.saveContacts(users,true);
// in background, do not refresh UI, notify it in notification bar
//設置本地消息推送通知
if(!easeUI.hasForegroundActivies()){
getNotifier().onNewMsg(message);
}
}
}
@Override
public void onCmdMessageReceived(List<EMMessage> messages) {
for (EMMessage message : messages) {
EMLog.d(TAG, "receive command message");
//get message body
//end of red packet code
//獲取擴展屬性 此處省略
//maybe you need get extension of your message
//message.getStringAttribute("");
//接收並處理擴展消息
String userName=message.getStringAttribute(Constant.ChatUserNick,"");
String userPic=message.getStringAttribute(Constant.ChatUserPic,"");
String hxIdFrom=message.getFrom();
EaseUser easeUser=new EaseUser(hxIdFrom);
easeUser.setAvatar(userPic);
easeUser.setNick(userName);
//存入內存
getContactList();
contactList.put(hxIdFrom,easeUser);
UserInfo userInfo = new UserInfo(hxIdFrom);
userInfo.setName(userName);
userInfo.setImage(userPic);
//存入db
ContactTableDao dao = Model.getInstance().getDBManager().getContactTableDao();
List<UserInfo> users=new ArrayList<UserInfo>();
users.add(userInfo);
dao.saveContacts(users,true);
// in background, do not refresh UI, notify it in notification bar
//設置本地消息推送通知
if(!easeUI.hasForegroundActivies()){
getNotifier().onNewMsg(message);
}
}
}
@Override
public void onMessageReadAckReceived(List<EMMessage> list) {
}
@Override
public void onMessageDeliveryAckReceived(List<EMMessage> list) {
}
@Override
public void onMessageChanged(EMMessage message, Object change) {
}
};
EMClient.getInstance().chatManager().addMessageListener(messageListener);
}
public EaseNotifier getNotifier(){
return easeUI.getNotifier();
}
}
4.完成後,需要在你自己的Application類中初始化:
public class IMApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
HxEaseuiHelper.getInstance().init(this);
}
}
5.至此,便完成了頭像和暱稱的顯示,最後務必檢查一下easeui中的EaseChatRow類:
private void setUpBaseView() {
......
//set nickname and avatar
if(message.direct() == Direct.SEND){
EaseUserUtils.setUserAvatar(context, EMClient.getInstance().getCurrentUser(), userAvatarView);
}else{
EaseUserUtils.setUserAvatar(context, message.getFrom(), userAvatarView);
EaseUserUtils.setUserNick(message.getFrom(), usernickView);
}
......
}