android中easeui 環信3.2.3 昵稱 頭像 設置解決辦法


首先看下官方的介紹的方法:

http://docs.easemob.com/im/490integrationcases/10nickname

官方只是介紹了理論實現方法,然而呢,眾多小伙伴都是和我一樣的啊,我們都是信封拿來主義的啊

既然如此,我就寫這篇博客來記錄下我的辛酸歷程,供大家參考借鑒學習

我集成的只是easeui,並沒有把官方的demo代碼全部集成進去吶,這樣的話我需要啥子功能,自己去demo中摳就好啦,好啦,大家都是這么干的啦

easeui集成步驟呢,這里就不細說了啊,官方說明的還是比較清楚的啦,下面是關於集成成功后的昵稱和頭像的設置辦法

進入正題

一,首先看easeui中的代碼,EaseChatFragment.java類中有個內部接口類EaseChatFragmentHelper,呀,看到這,忽然明白如果想自定義擴展字段,需要先自己實現這個方法啊,那就趕緊開工自己寫個類繼承EaseChatFragment並且實現這個接口類啊,上圖看的真切些

    @Override
    public void onSetMessageAttributes(EMMessage message) {
        if(isRobot){
            //set message extension
            message.setAttribute("em_robot_message", isRobot);
        }
        //設置要發送擴展消息用戶昵稱
        message.setAttribute(Constant.USER_NAME, "nike");
        //設置要發送擴展消息用戶頭像
        message.setAttribute(Constant.HEAD_IMAGE_URL, "http://img5.duitang.com/uploads/item/201508/30/20150830132007_TjANX.thumb.224_0.jpeg"); 
}

到此為止,就可以把昵稱和頭像發送出去啦

注意事項1:MyChatFragment實現了EaseChatFragmentHelper之后一定要調用EaseChatFragment中的setChatFragmentHelper(EaseChatFragmentHelper chatFragmentHelper)方法,調用地方截圖如下:

注意事項2:在easyui中,最終把昵稱和頭像顯示在控件上的代碼是在EaseUserUtils這個類中的setUserAvatar()方法和setUserNick()方法,截圖如下:

二,然后呢就是怎么接收昵稱和頭像啦,這個讓我找的挺費勁的

這個還得從easeui初始化的時候說起,大家都知道,環信初始化必須得在application類中進行初始化,那么就從這個類着手吧,

邊工作邊寫日志,想了想還是把代碼貼出來吧,關鍵代碼就是getUserInfo()方法中

public void init(Context context) {
        demoModel = new DemoModel(context);
        EMOptions options = initChatOptions();
        //use default options if options is null
        if (EaseUI.getInstance().init(context, options)) {
            appContext = context;

            //獲取easeui實例
            easeUI = EaseUI.getInstance();
            //初始化easeui
            easeUI.init(appContext,options);
            //在做打包混淆時,關閉debug模式,避免消耗不必要的資源
            EMClient.getInstance().setDebugMode(true);
            setEaseUIProviders();
            //設置全局監聽
            setGlobalListeners();

//            broadcastManager = LocalBroadcastManager.getInstance(appContext);
            initDbDao();
        }
    }


    private EMOptions initChatOptions(){
        EMOptions options = new EMOptions();
        // set if accept the invitation automatically
        options.setAcceptInvitationAlways(false);
        // set if you need read ack
        options.setRequireAck(true);
        // set if you need delivery ack
        options.setRequireDeliveryAck(false);

        return options;
    }

    protected void setEaseUIProviders() {
        // set profile provider if you want easeUI to handle avatar and nickname
        easeUI.setUserProfileProvider(new EaseUI.EaseUserProfileProvider() {

            @Override
            public EaseUser getUser(String username) {
                return getUserInfo(username);
            }
        });
    }

    private EaseUser getUserInfo(String username){
        //獲取 EaseUser實例, 這里從內存中讀取
        //如果你是從服務器中讀讀取到的,最好在本地進行緩存
        EaseUser user = null;
        //如果用戶是本人,就設置自己的頭像
        if(username.equals(EMClient.getInstance().getCurrentUser())){
            user=new EaseUser(username);
            user.setAvatar((String)SharedPreferencesUtils.getParam(appContext,APPConfig.USER_HEAD_IMG,""));
            user.setNick((String)SharedPreferencesUtils.getParam(appContext, APPConfig.USER_NAME,"nike"));
            return user;
        }
//        if (user==null && getRobotList()!=null){
//            user=getRobotList().get(username);
//        }

        //收到別人的消息,設置別人的頭像
        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());
            }
        }
        Log.i("zcb","頭像:"+user.getAvatar());

        return user;
    }

    private void initDbDao() {
        inviteMessgeDao = new InviteMessgeDao(appContext);
        userDao = new UserDao(appContext);
    }

    public Map<String, RobotUser> getRobotList() {
        if (isLoggedIn() && robotList == null) {
            robotList = demoModel.getRobotList();
        }
        return robotList;
    }

    /**
     * get current user's id
     */
    public String getCurrentUsernName(){
        if(username == null){
            username = (String)SharedPreferencesUtils.getParam(appContext, Constant.HX_CURRENT_USER_ID,"");
        }
        return username;
    }

    /**
     *獲取所有的聯系人信息
     *
     * @return
     */
    public Map<String, EaseUser> getContactList() {
        if (isLoggedIn() && contactList == null) {
            contactList = demoModel.getContactList();
        }

        // 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.USER_NAME,"");
                    String userId=message.getStringAttribute(Constant.USER_ID,"");
                    String userPic=message.getStringAttribute(Constant.HEAD_IMAGE_URL,"");
                    String hxIdFrom=message.getFrom();
                    System.out.println("helper接收到的用戶名:"+userName+"helper接收到的id:"+userId+"helper頭像:"+userPic);
                    EaseUser easeUser=new EaseUser(hxIdFrom);
                    easeUser.setAvatar(userPic);
                    easeUser.setNick(userName);

                    //存入內存
                    getContactList();
                    contactList.put(hxIdFrom,easeUser);

                    //存入db
                    UserDao dao=new UserDao(appContext);
                    List<EaseUser> users=new ArrayList<EaseUser>();
                    users.add(easeUser);
                    dao.saveContactList(users);



                    // 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("");
                }
            }

            @Override
            public void onMessageRead(List<EMMessage> messages) {
            }

            @Override
            public void onMessageDelivered(List<EMMessage> message) {
            }

            @Override
            public void onMessageChanged(EMMessage message, Object change) {

            }
        };

        EMClient.getInstance().chatManager().addMessageListener(messageListener);
    }

至此可以正常顯示自己和對方的頭像和昵稱了。

 源碼:https://github.com/zhangchunbin/HuanXinDemo

測試賬號: 用戶名:test 密碼:123456

用戶名 test1 密碼:123456

歡迎吐槽...

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM