• Android 环信聊天头像昵称显示解决方案


    从消息扩展中获取昵称和头像
    昵称和头像的获取:把用户基本的昵称和头像的URL放到消息的扩展中,通过消息传递给接收方,当收到一条消息时,则能通过消息的扩展得到发送者的昵称和头像URL,然后保存到本地数据库和缓存。当显示昵称和头像时,请从本地或者缓存中读取,不要直接从消息中把赋值拿给界面(否则当用户昵称改变后,同一个人会显示不同的昵称)。
    昵称和头像的更新:当扩展消息中的昵称和头像URI与当前本地数据库和缓存中的相应数据不同的时候,需要把新的昵称保存到本地数据库和缓存,并下载新的头像并保存到本地数据库和缓存。

    1、在登录的时候,把自己登录成功时后台返回的信息保存到sharedpreferences中,需要包含需要的头像和昵称。

           //保存到sharedpreferences
                SPUtils.setValueToPrefrences("name", loginBean.getName());
                SPUtils.setValueToPrefrences("logoUrl", loginBean.getLogoUrl());
                // 将自己服务器返回的环信账号、昵称和头像URL设置到帮助类中。
                DemoHelper.getInstance().getUserProfileManager().updateCurrentUserNickName(loginBean.getName());
                DemoHelper.getInstance().getUserProfileManager().setCurrentUserAvatar(loginBean.getLogoUrl());
                DemoHelper.getInstance().setCurrentUserName(loginUser.getHxId()); // 环信Id

     2.ChatFragment类中有一个扩展属性的说明,没错,就是这个方法,把你要发送的内容尽情的发送吧,现附上发送头像和昵称的代码:

      @Override
      public void onSetMessageAttributes(EMMessage message) {
        if (isRobot) {
          // 设置消息扩展属性
          message.setAttribute("em_robot_message", isRobot);
        }
    
        // 通过扩展属性,将userPic和userName发送出去。
        String userPic = SPUtils.getValueFromPrefrences("logoUrl", "");
        if (!TextUtils.isEmpty(userPic)) {
          message.setAttribute("userPic", userPic);
        }
        String userName = SPUtils.getValueFromPrefrences("name", "");
        if (!TextUtils.isEmpty(userName)) {
          message.setAttribute("userName", userName);
        }
      }
    3、发送完成后,肯定需要一个接收,其实demo中的广播已经接收好了,那么我们跟随着广播的脚步,来到DemoHelper这个类,初次看这个类,都是云一样的感觉,经过一番查找,发现有个onMessageReceived的方法,并且还有注释“全局监听”,赶紧开工,试试接收吧,可以自己打一下log出来看是不是拿到了我们要的。并且照着demoHelper中的保存方法,将接收到的内容保存起来。
        @Override
        public void onMessageReceived(List<EMMessage> messages) {
          for (EMMessage message : messages) {
            message.setMsgTime(System.currentTimeMillis());
            //************接收并处理扩展消息***********************
            String userName = message.getStringAttribute("userName", "");
            String userPic = message.getStringAttribute("userPic", "");
            String hxIdFrom = message.getFrom();
            EaseUser easeUser = new EaseUser(hxIdFrom);
            easeUser.setAvatar(userPic);
            easeUser.setNick(userName);
    
            // 存入内存
            getContactList();
            contactList.put(hxIdFrom, easeUser);
            // 存入db
            UserDao dao = new UserDao(MainApplication.getContext());
            List<EaseUser> users = new ArrayList<EaseUser>();
            users.add(easeUser);
            dao.saveContactList(users);
    
            getModel().setContactSynced(true);
    
            // 通知listeners联系人同步完毕
            notifyContactsSyncListener(true);
            if (isGroupsSyncedWithServer()) {
              notifyForRecevingEvents();
            }
    
            // ******************扩展信息处理完成**********************
            EMLog.d(TAG, "onMessageReceived id : " + message.getMsgId());
            // 应用在后台,不需要刷新UI,通知栏提示新消息
            if (!easeUI.hasForegroundActivies()) {
              getNotifier().onNewMsg(message);
            }
          }
        }

    5、信息都收到了,就差最后一步就可以显示了。那在哪里进行显示呢?还是在DemoHelper中,找到getUserInfo方法,代码如下:

    private EaseUser getUserInfo(String hxId) {
        // 获取user信息,demo是从内存的好友列表里获取,
        // 实际开发中,可能还需要从服务器获取用户信息,
        // 从服务器获取的数据,最好缓存起来,避免频繁的网络请求
    
        if (hxId.equals(EMClient.getInstance().getCurrentUser())) {
          EaseUser currentUserInfo = getUserProfileManager().getCurrentUserInfo();
          return currentUserInfo;
        }
        EaseUser easeUser;
        if (contactList != null && contactList.containsKey(hxId)) {
    
        } else { // 如果内存中没有,则将本地数据库中的取出到内存中。
          getContactList();
        }
        // // TODO 获取不在好友列表里的群成员具体信息,即陌生人信息,demo未实现
        // if (user == null && getRobotList() != null) {
        // user = getRobotList().get(hxId);
        // }
        easeUser = contactList.get(hxId);
        if(easeUser == null){
          easeUser = new EaseUser(hxId);
        } else {
          if(TextUtils.isEmpty(easeUser.getNick())){ // 如果名字为空,则显示环信号码
            easeUser.setNick(easeUser.getUsername());
          }
        }
        return easeUser;
      }
    到这里你的头像已经可以显示了。



  • 相关阅读:
    insert插入多条数据
    dbms_output输出中文乱码
    redhat6.2安装rlwrap
    IIS实现HTTPS的主机名绑定
    windows10家庭版 远程桌面报错
    Encryption requires the OpenSSL PHP extension 报错
    Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use ...报错
    报错:org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
    异常:java.lang.NoClassDefFoundError: org/springframework/expression/ParserContext
    IntelliJ Idea解决Could not autowire. No beans of 'xxxx' type found的错误提示
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/9555690.html
Copyright © 2020-2023  润新知