这两天调试环信的心得

一.集成就不多说了,官方文档都有的,可以自己去看:
集成进来有一个小的问题就是设置昵称和头像。

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

new Thread(new Runnable() {
      @Override
      public void run() {
        EMClient.getInstance().login(username, password, new EMCallBack() {
          @Override
          public void onSuccess() {
            // 登陆成功,保存用户昵称与头像URL
            AppSPUtils.setValueToPrefrences("name", loginBean.getName());
            AppSPUtils.setValueToPrefrences("logoUrl", loginBean.getLogoUrl());
      // 将自己服务器返回的环信账号、昵称和头像URL设置到帮助类中。
            DemoHelper.getInstance().getUserProfileManager().updateCurrentUserNickName(loginBean.getName());
            DemoHelper.getInstance().getUserProfileManager().setCurrentUserAvatar(loginBean.getLogoUrl());
            DemoHelper.getInstance().setCurrentUserName(loginUser.getHxId()); // 环信Id
           // ------以下参考demo中的,加载群组和加载消息。然后跳转到首页-------

2、AppSPUtils是个人写的一个工具类,大家可以自己写一个,给出参考代码。

public class AppSPUtils {
    private final static int MODE_SPEC = android.os.Build.VERSION.SDK_INT <= 10 ? 0 : Context.MODE_MULTI_PROCESS;
    public static SharedPreferences getSharedPreferences(String name) {
        return MainApplication.getContext().getSharedPreferences(name,
                Context.MODE_PRIVATE | MODE_SPEC);
    }
    public static SharedPreferences getAppSharedPreferences() {
        return getSharedPreferences(Constants.SP_APP);
    }
        public static String getValueFromPrefrences(String key, String defaultValue) {
        return getValueFromPrefrences(getAppSharedPreferences(), key, defaultValue);
    }
        public static void setValueToPrefrences(String key, String value) {     
        try {
            SharedPreferences preferences = getAppSharedPreferences();
            if (null != preferences) {
                preferences.edit().putString(key, value).commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
        // 退出登录时要调用
    public static void clean() {
        try {
            SharedPreferences preferences = getAppSharedPreferences();
            if (null != getAppSharedPreferences()) {
                getAppSharedPreferences().edit().clear().commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、保存好自己的信息后,已经成功了四分之一,现在是如何将自己的头像昵称等信息发送出去,最简单的就是使用扩展消息了,在ChatActivity中可以看到,基本上只做了一件事,保证只有一个ChatActivity,那我们的代码在哪里?就在ChatFragment里面。找到代码,可以看到其实它是继承自EaseChatFragment,很多内容在easeui中已经做好了。这时你会发现ChatFragment类中有一个扩展属性的说明,没错,就是这个方法,把你要发送的内容尽情的发送吧,现附上发送头像和昵称的代码:

@Override
  public void onSetMessageAttributes(EMMessage message) {
    if (isRobot) {
      // 设置消息扩展属性
      message.setAttribute("em_robot_message", isRobot);
    }
    // 通过扩展属性,将userPic和userName发送出去。
    String userPic = AppSPUtils.getValueFromPrefrences("logoUrl", "");
    if (!TextUtils.isEmpty(userPic)) {
      message.setAttribute("userPic", userPic);
    }
    String userName = AppSPUtils.getValueFromPrefrences("name", "");
    if (!TextUtils.isEmpty(userName)) {
      message.setAttribute("userName", userName);
    }
  }

4、发送完成,你已经完成了四分之二的任务了。发送完成后,肯定需要一个接收,其实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是从内存的好友列表里获取,// 实际开发中,可能还需要从服务器获取用户信息,// 从服务器获取的数据,最好缓存起来,避免频繁的网络请求

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;
  }

OK,大功告成,到这里你的头像已经可以显示了。。恭喜你!有朋友还有疑问,为什么头像是方形的,要变成圆形怎么办?指个路,在easeui中的utils包下,找到EaseUserUtils,这里就是显示用户头像和用户昵称的地方,通过Glide可以轻松显示圆形头像,百度有很多方法,这里就不多讲了,同样,你也可以通过其他图形加载框架来完成。很多朋友不明白扩展消息的是什么东西,也不明白为什么照着代码敲就能够完成头像的显示,那下面就给大家粗浅的讲讲所涉及到的逻辑关系。扩展消息:就是你每一次发送消息,都会附带在你发送内容上面的额外消息,他会随着你的内容发送出去,每次会多一点点流量,但微乎其微,个人认为并无多大影响。显示头像逻辑:区分为本地化缓存和运行内存缓存,在demoHelper中可以发现,有一个成员变量private Map contactList; 这个就是用来保存在运行内存缓存的,只有通过运行缓存,显示头像是最顺畅的,如果每次都从数据库中读取的话,聊天界面会比较卡,有朋友保存在SP里面,以ID做为KEY,头像和昵称等拼接做为value进行缓存,取出后再拆分开分别取值,据说是不卡,大家可以试一下。本地化存储是为了在每次打开软件的时候,从本地存储中拿到运行内存中使用做准备,大家可以认真看看demoHelper和MainActivity中的代码。———————————————————————————-讲了方法2设置头像,那么方法1,个人不推荐,但这里给出处理的过程,如有个别有需求的,可以按方法1来处理:1、登录成功后,在手机子线程,访问你们的后台服务器,拿到所有好友的环信ID,头像,昵称。然后按上面的保存方法,保存到本地中,完成后发送广播或EventBus之类到,刷新消息界面和ChatFragment。2、在getUserInfo中,写和上面扩展消息一样的内容,将如果运行缓存和本地都拿不到,则发起网络请求到后台获取头像,等请求到内容后,再发出广播或EventBus通知刷新消息界面和ChatFragment。————————————————————————————-以上仅为本人在开发过程中的一点小小心得,demo中的保存运存和本地储存的方法,大家也可以单独写,并不会影响程序的运行

监听发送过来的消息的代码 在主页面中实现:

EMMessageListener messageListener = new EMMessageListener() {

        @Override
        public void onMessageReceived(List<EMMessage> messages) {
            // 提示新消息
            for (EMMessage message : messages) {
                DemoHelper.getInstance().getNotifier().onNewMsg(message);
            }
            refreshUIWithMessage();
        }

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

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

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

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

    private void refreshUIWithMessage() {
        runOnUiThread(new Runnable() {
            public void run() {
                // 刷新bottom bar消息未读数
                // 当前页面如果为聊天历史页面,刷新此页面
                if (conversationListFragment != null) {
                    conversationListFragment.refresh();
                }
            }
        });
    }

在主页面中实现:

@Override
    protected void onResume() {
        super.onResume();
        EMClient.getInstance().chatManager().addMessageListener(messageListener);
    }

    @Override
    protected void onStop() {
        EMClient.getInstance().chatManager().removeMessageListener(messageListener);
        super.onStop();
    }
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值