1.问题
在使用环信进行及时聊天时或者群聊时,显示用户名称的往往是其环信username(例如165983547),但我们真正希望显示的是用户的昵称(例如 张三),而聊天时候的头像默认是环信默认头像而不是用户自己的头像,其实在环信官方文档上没有明确说明如何设置,但其实官方提供了api给我们设置的。
2.解决
首先创建一个MyUserProvider类,该类继承自EaseUI.EaseUserProfileProvider,该类需要实现getUser方法。并且封装了setUser方法用于设置用户信息。
public class MyUserProvider implements EaseUI.EaseUserProfileProvider{
//单例类
private static MyUserProvider myUserProvider;
//用户列表(包含自己和聊天对象)
private Map<String,EaseUser> userList = new HashMap<>();
private String ImgUrl="";//头像(需要从服务器获取)
@Override
public EaseUser getUser(String username) {
if(userList.containsKey(username))
//有就返归这个对象。。
return userList.get(username);
System.out.println("error : 没有 数据" + username);
return null;
}
public void setUser(String username,String nickname,String imageUrl){
if(!userList.containsKey(username)) {
EaseUser easeUser = new EaseUser(username);
userList.put(username,easeUser);
}
EaseUser easeUser = getUser(username);
// 环信的easerUser的父类有一个setNickname 的方法可以用来设置昵称,直接调用就好。。
easeUser.setNickname(nickname);
// 同理,设置一个图像的url就好,因为他加载头像是使用glide加载的
easeUser.setAvatar(imageUrl);
}
// 获取单例子
public static MyUserProvider getInstance() {
if (myUserProvider == null) {
myUserProvider = new MyUserProvider();
}
return myUserProvider;
}
//public static void Uninit(){
//myUserProvider = null;
//}
}
创建了该类后,需要在初始化环信的application中设置provider。
//EaseUI初始化
if(EaseUI.getInstance().init(this, options)){
EMClient.getInstance().setDebugMode(true);
}
//setGlobalListeners();
//设置provider
EaseUI.getInstance().setUserProfileProvider(MyUserProvider.getInstance());
这样就可以设置自己的昵称和头像了,调用方法如下,其中第一个参数是自己的环信username第二参数是自己的昵称第三个参数是自己头像url。
MyUserProvider.getInstance().setUser("782359098","张三","http://xxxx//xx.png");
这样,设置了自己的信息后,和别人聊天就可以显示自己头像和昵称了。那么如何显示别人的头像和昵称呢?这里在环信的官方文档上介绍了,其中在聊天页面ChatFragment中有个重载方法onSetMessageAttributes(EMMessage message)该方法可以给发出的消息添加拓展属性,我们可以在发送消息时将自己的昵称、环信用户名、头像url等信息添加到消息拓展属性中一起发送给聊天对象,这样聊天对象就能获取我们发送的昵称、环信用户名、头像url等信息了,然后聊天对象进行相应的昵称设置、头像设置操作,这样对方就能显示我的头像和昵称了,反过来也一样,我们收到对方的消息,获取对方消息的拓展属性信息,进行相关设置,我们也能显示对方的头像和昵称了,具体代码如下,当然,为了展示方便,我把环信username、昵称、头像url写死了,这些写死的数据应该是根据具体业务逻辑得到的。
@Override
public void onSetMessageAttributes(EMMessage message) {
//设置昵称、头像等信息,添加到消息拓展属性中,其中message是待发送的消息
message.setAttribute("ImUserName", "2385736485");//设置我的环信username
message.setAttribute("ImNickName", "李四");//设置我的昵称
message.setAttribute("ImImageUrl", "http://xxx//xx.png");//设置我的头像url
}
那么我们的拓展信息可以发送给聊天对象了,那么我们怎么接收聊天对象的拓展信息呢? 环信提供了一个设置监听消息到来的方法,我们必须实现监听消息,具体代码如下。
EMClient.getInstance().chatManager().addMessageListener(new EMMessageListener() {
@Override
public void onMessageReceived(List<EMMessage> list) {
//接收到对方的消息
for (EMMessage message : list) {
String imUserName = message.getStringAttribute("ImUserName","");
String imNickName = message.getStringAttribute("ImNickName","");
String imImageUrl = message.getStringAttribute("ImImageUrl","");
Log.i("对方用户昵称",imNickName);
Log.i("对方用户名",imUserName);
Log.i("对方用户头像",imImageUrl);
//设置对方信息(如果没这段代码,我们手机将会不显示对方的头像和昵称)
//通过MyUserProvider设置对方信息(每次和用户聊天必须传递给用户自己的信息,然后对方将会保存这些信息到MyUserProvider中,再保存到数据库中)
MyUserProvider.getInstance().setUser(imUserName,imNickName,imImageUrl);
//保存到内存
//保存到数据库
}
}
@Override
public void onCmdMessageReceived(List<EMMessage> list) {
}
@Override
public void onMessageRead(List<EMMessage> list) {
}
@Override
public void onMessageDelivered(List<EMMessage> list) {
}
@Override
public void onMessageRecalled(List<EMMessage> list) {
}
@Override
public void onMessageChanged(EMMessage emMessage, Object o) {
}
});
添加监听方法是在application中初始化环信后实现,其中我们用到了 MyUserProvider中的setUser来设置用户信息,这样我们和对方聊天就可以显示对方的头像和昵称了,必须注意一点的是,我们必须将对方的信息保存到数据库和内存中,如果没有这样做,以后app销毁并重新启动后我们仍然看不到对方的昵称以及头像,只有对方向我们发消息我们才能看到他的头像和昵称。
本文介绍如何在环信聊天应用中自定义用户昵称和头像,通过创建MyUserProvider类并实现EaseUserProfileProvider接口,设置用户信息并在聊天过程中传递和接收这些信息。
2196

被折叠的 条评论
为什么被折叠?



