環信頭像和暱稱的顯示

環信頭像和暱稱的顯示–基於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);
    }
    ......
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章