在上一篇文章中提到了要在初始化的时候,设置用户信息提供者类——EaseUserProfileProvider,用以获取用户信息。下面我们来看一下 EaseUserProfileProvider 是怎么发挥作用的。

1、首先 EaseUserProfileProvider 在哪里被调用了。

我们可以看到它是在 EaseUI 这个类中被定义的接口,

 /*** User profile provider* @author wei**/public interface EaseUserProfileProvider {/*** return EaseUser for input username* @param username* @return*/EaseUser getUserInfo(String username);
}
复制代码

封装在了 EaseUserUtils 中使用:

public class EaseUserUtils {static EaseUserProfileProvider userProvider;static {userProvider = EaseUI.getInstance().getUserProfileProvider();}/*** get EaseUser according username* @param username* @return*/public static EaseUser getUserInfo(String username){if(userProvider != null)return userProvider.getUser(username);return null;}/*** set user avatar* 根据UserName设置控件头像* @param username*/public static void setUserAvatar(Context context, String username, ImageView imageView){EaseUser user = getUserInfo(username);if(user != null && user.getAvatar() != null){try {Glide.with(context).load(user.getAvatar()).into(imageView;} catch (Exception e) {//use default avatar//替换Glide为4.0之后改变的方法。Glide.with(context).load(R.drawable.icon_my_personalinfo).into(imageView);}}else{Glide.with(context).load(R.drawable.icon_my_personalinfo).into(imageView);}}/*** set user's nickname*/public static void setUserNick(String username,TextView textView){if(textView != null){EaseUser user = getUserInfo(username);if(user != null && user.getNick() != null){textView.setText(user.getNick());}else{textView.setText(username);}}}……}
复制代码

  这里基于 getUserInfo 方法,又封装了 setUserAvatar 方法设置用户头像,我们还可以封装一些其他方法,例如设置用户性别方法。

    /*** set user sex* 根据UserName设置控件性别* @param username*/public static void setUserSex(Context context, String username, ImageView imageView){EaseUser user = getUserInfo(username);if(user != null && user.getSex() != 0){//1是男,2是女if (user.getSex() == 1) {Glide.with(context).load(R.drawable.icon_nan).into(imageView);}else if (user.getSex() == 2){Glide.with(context).load(R.drawable.icon_nv).into(imageView);}}}
复制代码

可以发现 setUserAvatar方法在 easeUI 的很多地方都用到,比较重要的几个地方是:
  EaseChatRow 类中,即消息气泡旁边的用户昵称、头像;
  EaseConversationAdapter 类中,即消息列表界面上的昵称、头像;
  EaseContactAdapter 类中,即联系人列表。

在以上类中,我们可以重新绘制布局,添加自定义的控件,进行用户信息的显示。例如:

EaseConversationAdapter{……@Overridepublic View getView(int position, View convertView, ViewGroup parent) {        ……   //单聊// 不使用原easeUI代码中环信账户做为昵称// EaseUserUtils.setUserNick(username, holder.name);String remark = EaseUserUtils.getUserInfo(username).getRemark();if (!TextUtils.isEmpty(remark)){//如果有备注的话,显示备注holder.name.setText(remark);}else {//显示7个长度的昵称String nickName = TextUtils.isEmpty(EaseUserUtils.getUserInfo(username).getNickname()) ? username : EaseUserUtils.getUserInfo(username).getNickname();nickName = nickName.length() > 7 ? nickName.substring(0, 6) : nickName;holder.name.setText(nickName);}//显示自定义的控件holder.sex.setVisibility(View.VISIBLE);//增加setUserSex方法EaseUserUtils.setUserSex(getContext(),username,holder.sex);holder.motioned.setVisibility(View.GONE);}
}
复制代码

布局部分很简单,自己画就可以了。以上都是在说我们获取到用户信息之后进行的操作,那么下面就是重点。

2、用户信息的获取以及本地存储

请按以下步骤快速集成本地缓存用户类:

(1)下载

环信简版Demo

使用cache包中前三个类,注意是前三个类前三个类,分别用于数据库增删改、用户缓存类,缓存管理类。

其中 UserCacheInfo 中可以增加需要保存的属性。

    ……/*备注*/@DatabaseFieldprivate String remark;/*性别*/@DatabaseFieldprivate int sex;……复制代码

(2)增加依赖库

compile 'com.j256.ormlite:ormlite-android:5.0'
compile 'com.google.code.gson:gson:2.8.0'
复制代码

ormlite:操作 sqlite 数据库
gson:json 对象转换

UserCacheManager.java 中注释第57-68行代码:

   public static UserCacheInfo get(final String userId) {UserCacheInfo info = null;// 如果本地缓存不存在或者过期,则从存储服务器获取
//        if (notExistedOrExpired(userId)){
//            CommonLoader.get(userId, ) {
//                @Override
//                public void onCompleted(UserWebInfo info) {
//                    if(info == null) return;
//
//                    // 缓存到本地
//                    // info.getOpenId() 为该用户的【环信ID】
//                    save(info.getOpenId(), info.getNickName(),info.getAvatarUrl());
//                }
//            });
//        }// 从本地缓存中获取用户数据info = getFromCache(userId);return info;}
复制代码

(3)设置用户信息提供者(setUserProfileProvider),实现 getUserInfo 函数。

private EaseUser getUserInfo(String username){// To get instance of EaseUser, here we get it from the user list in memory// You'd better cache it if you get it from your server// 从本地缓存中获取用户昵称头像EaseUser user = UserCacheManager.getEaseUser(username);return user;}
复制代码
public class UserCacheManager {……/*** 获取用户信息** @param userId* @return*/public static EaseUser getEaseUser(String userId) {UserCacheInfo user = get(userId);if (user == null) return null;EaseUser easeUser = new EaseUser(userId);easeUser.setRemark(user.getRemark());easeUser.setAvatar(user.getAvatarUrl());easeUser.setNickname(user.getNickName());easeUser.setSex(user.getSex());return easeUser;}……
}    复制代码

(4)登录(或注册)成功后,保存当前用户的昵称头像。

在登录(或注册)自己服务器的回调方法(不是环信IM登录回调)里,增加如下代码:

// 登录成功,将当前用户的环信ID、备注、昵称和头像、性别保存在本地
UserCacheManager.save(userId, "", nickName, avatarUrl,sex);
复制代码
public class UserCacheManager {……public static boolean save(String userId,String remark ,String nickName, String avatarUrl, int sex) {try {Dao<UserCacheInfo, Integer> dao = SqliteHelper.getInstance().getUserDao();UserCacheInfo user = getFromCache(userId);// 新增if (user == null) {user = new UserCacheInfo();}//这是一个方便的方法,用于在数据库中创建一个不存在的项目。从数据参数中提取id,并在数据库上创建一个查询-by-id。// 如果具有相同id的数据存在,那么该数据中的所有字段都将更新。user.setUserId(userId);user.setRemark(remark);user.setAvatarUrl(avatarUrl);user.setNickName(nickName);user.setSex(sex);//1男2女user.setExpiredDate(new Date().getTime() + 24 * 60 * 60 * 1000);// 1天过期,单位:毫秒Dao.CreateOrUpdateStatus status = dao.createOrUpdate(user);if (status.getNumLinesChanged() > 0) {Log.i("UserCacheManager", "操作成功~");return true;}} catch (Exception e) {e.printStackTrace();Log.e("UserCacheManager", "操作异常~");}return false;}……
}
复制代码

也可以先用以下随机生成用户昵称头像的代码:

Random random=new Random();
String userId = EMClient.getInstance().getCurrentUser();// 用户环信ID
String nickName = String.format("小草%d",random.nextInt(10000));// 用户昵称
String avatarUrl = String.format("http://duoroux.com/chat/avatar/%d.jpg",random.nextInt(10));// 用户头像(绝对路径)
int sex = 1;
UserCacheManager.save(userId, "", nickName, avatarUrl,sex);
复制代码

(5)发送消息时携带昵称头像

在实现了 EaseChatFragment.EaseChatFragmentHelper 接口的类中, onSetMessageAttributes() 函数,增加代码:

// 设置消息的扩展属性,携带昵称头像
UserCacheManager.setMsgExt(message);
复制代码
public class UserCacheManager {/*** 消息扩展属性*/public static final String kChatUserId = "ChatUserId";// 环信IDpublic static final String kChatUserRemark = "ChatUserRemark";// 昵称public static final String kChatUserNick = "ChatUserNick";// 昵称public static final String kChatUserPic = "ChatUserPic";// 头像Urlpublic static final String kChatUserSex = "ChatUserSex";//性别……/*** 设置消息的扩展属性** @param msg 发送的消息*/public static void setMsgExt(EMMessage msg) {if (msg == null) return;UserCacheInfo user = getMyInfo();if (user == null || TextUtils.isEmpty(user.getUserId())) {ToastUtil.showShortToast("用户没有登录,请重新登录");return;}msg.setAttribute(kChatUserNick, user.getNickName());msg.setAttribute(kChatUserPic, user.getAvatarUrl());if (msg.getChatType() == EMMessage.ChatType.Chat) {msg.setAttribute(kChatUserId, user.getUserId());msg.setAttribute(kChatUserSex, user.getSex());}if (msg.getChatType() == EMMessage.ChatType.GroupChat) {//如果是群聊,保存群的用户id。msg.setAttribute(kChatUserId, msg.conversationId());}}……
}
复制代码

(6)接收消息时携带昵称头像

在继承了 EaseChatFragment 的类中重写 onMessageReceived 函数,保存消息中的用户信息:

    @Overridepublic void onMessageReceived(List<EMMessage> messages) {for (EMMessage message : messages){EaseHelper.saveUserInfo(message);}super.onMessageReceived(messages);}复制代码
public class EaseHelper {……//保存用户信息public static void saveUserInfo(EMMessage message){String userId = message.getFrom();String avatarUrl = message.ext().get(UserCacheManager.kChatUserPic).toString();String nickName = message.ext().get(UserCacheManager.kChatUserNick).toString();//1男2女,0表示没有性别信息。int sex = 0;if (message.ext().get(UserCacheManager.kChatUserSex) != null){sex = Integer.valueOf(message.ext().get(UserCacheManager.kChatUserSex).toString());}if (UserCacheManager.getEaseUser(userId) != null){String remark = UserCacheManager.getEaseUser(userId).getRemark();UserCacheManager.save(userId,remark,nickName,avatarUrl,sex);}else{UserCacheManager.save(userId,"",nickName,avatarUrl,sex);}}……}
复制代码

三、补充说明

  除了以上在登录之后和接受消息时保存用户信息之外,还需要在修改好友备注之后进行保存,在请求好友资料时进行保存。另外,每个用户对别人的备注都是不一样的,所以不需要在消息中携带好友备注。

四、语音、视频通话功能头像昵称处理(无此需求可忽略)

需要以下步骤:

1、发送音视频通话请求时携带昵称头像。

CallActivity.java里第162行代码更改为:

// 通过扩展属性将昵称头像传给对方
String ext = UserCacheManager.getMyInfoStr();
if (msg.what == MSG_CALL_MAKE_VIDEO) {EMClient.getInstance().callManager().makeVideoCall(username,ext);
} else { EMClient.getInstance().callManager().makeVoiceCall(username,ext);
}
复制代码

2、接收音视频通话时保存昵称头像。

CallReceiver.java第33行增加代码:

// 缓存用户昵称头像
String ext = EMClient.getInstance().callManager().getCurrentCallSession().getExt();
UserCacheManager.save(ext);
复制代码

3、音频通话里显示昵称头像。

VoiceCallActivity.java第114行代码改为:

// 显示昵称头像
UserCacheInfo user = UserCacheManager.get(username);
if (user != null){nickTextView.setText(user.getNickName());//Glide.with(VoiceCallActivity.this).load(user.getAvatarUrl()).placeholder(R.drawable.em_default_avatar).into(avatarImage);}else {nickTextView.setText(username);}
复制代码

4、视频通话里显示昵称头像。

VideoCallActivity.java第171行代码改为:

// 显示昵称头像
UserCacheInfo user = UserCacheManager.get(username);
if (user != null){nickTextView.setText(user.getNickName());
}else {nickTextView.setText(username);
}
复制代码

Android环信爬坑指北(二)头像昵称好友备注显示相关推荐

  1. 环信ease-sdk-3.3.4_r1 集成用户头像 昵称功能的简单处理方法

    环信服务器并不保存用户的头像用户名,但实际开发需要设置用户昵称头像.下面提供一个简单的办法设置用户的头像昵称,这里的头像昵称从自己的服务器获取的并且保存到本地. 1.服务端的设计 服务端设计比较简单, ...

  2. android 环信客服修改自己的头像

    因为自己项目目中遇到到了,有自己的需求,所以就修改了环信自己的头像,客服的头像也修改了,好了废话不多说了上干活 首先找到easeui中的类EaseUserUtils       不过我把图片都保存到本 ...

  3. Android平台MediaCodec避坑指北

    https://www.jianshu.com/p/5d62a3cf0741 最近使用MediaCodec做编解码H264,写一点东西以免自己再次掉坑. 先说一下具体环境,使用的是,Windows10 ...

  4. .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了

    一.路径问题 1.在平常的WPF(及windows应用软件)开发中,访问文件(懒一点的话)(比如我)通常就直接使用 字符串拼接 举个例子,我们访问软件vb.net教程目录下的\Data\xxx.txt ...

  5. Android环信3.0即时通讯云入门指北

    Android环信3.0即时通讯云入门指北 官方文档 http://docs-im.easemob.com/im/android/sdk/import 基础集成 http://docs-im.ease ...

  6. 工作篇 之 简单聊下有关环信的 “坑” ...

    LZ-Says:相遇,相知,相恋,争执,平淡,压抑,愤懑,该画上句号了. 前言 环信,Enmmm,牛逼,懵 ing -! 最近这段时间一直围绕环信,在使用的过程中,遇到很多很多问题,自己都感觉蒙圈,烦 ...

  7. 美团·北极星开发对接避坑指北(Java)

    背景:公司做美团洗涤上门业务,本来好好的,后面美团要求接入美团·北极星订单预约接口,才能正常使用,没办法只能去接接口了,但是遇到了无数的坑,所以就有了这篇<美团·北极星开发对接避坑指北>, ...

  8. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  9. Serverless实战 —— 三分钟入坑指北 Docsify + Serverless Framework 快速创建个人博客系统

    三分钟入坑指北

最新文章

  1. Python基础教程:列表的四种常用方法
  2. Android 图形驱动初始化
  3. leetcode 228. 汇总区间(Java版)
  4. 怎么取消苹果手机自动续费_手机 App 自动续费套路多?我们要如何取消?
  5. 报错显示从客户端检测到有潜在危险的Request.Form 值
  6. python 第三方绘图库_D3py首页、文档和下载 - 基于 D3 的 Python 绘图库 - OSCHINA - 中文开源技术交流社区...
  7. eclipse 基础设置
  8. java,类的构造方法
  9. 2019.1.15 作业
  10. RS485接口的EMC设计方案
  11. 模2除法(计算CRC校验码)
  12. OSChina 周六乱弹 —— 谁小时候没当过熊孩子呀
  13. Python学习week4
  14. 【游戏测试】客户端性能 - drawcall 工具链
  15. 分析可执行文件mach-o
  16. 小菜鸟之oracle数据字典
  17. android+酷炫动画效果,Android简单酷炫点击动画(附源码)
  18. 金融农民工转行Java开发,3年时间月薪翻5倍
  19. 64位系统使用Access 数据库文件遇到的错误和解决办法
  20. 人脸识别闸机python_Python 40行代码实现人脸识别功能

热门文章

  1. log4net配置学习 之 日志等级
  2. eclipse 切换svn账号
  3. 希尔排序(插入排序的优化算法)
  4. 最亲密接触DhtmlJScript开发细节
  5. 计算上月、下月、上周、下周..日期范围
  6. windows7专业版_windows7专业版和旗舰版的区别
  7. javaee, javaweb和javase的区别以及各自的知识体系
  8. xftp permission is not allowed
  9. Eclipse快捷键指南
  10. Stroke filter: 一种用于OCR预处理的文字滤波器