环信头像和昵称的显示

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

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

环信头像和昵称的显示–基于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);
    }
    ......
}

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值