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/zcbin88/HuanXinDemo

测试账号: 用户名:test 密码:123456

用户名 test1 密码:123456

欢迎吐槽...

 

 

 

posted @ 2017-01-17 11:13  客舍青  阅读(10197)  评论(41编辑  收藏  举报