环信头像和昵称的显示–基于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);
}
......
}
本文介绍基于Easeui实现环信头像和昵称显示的方法。首先在登录成功时将昵称和头像保存到本地,利用SpUtils工具类缓存信息;接着在easeChatFragment聊天监听中,将昵称和头像作为扩展消息发送;再准备处理显示的类,最后检查easeui中的EaseChatRow类。

5524

被折叠的 条评论
为什么被折叠?



