解决Android设置环信显示头像和昵称问题

本文介绍如何在环信聊天应用中自定义用户昵称和头像,通过创建MyUserProvider类并实现EaseUserProfileProvider接口,设置用户信息并在聊天过程中传递和接收这些信息。

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销毁并重新启动后我们仍然看不到对方的昵称以及头像,只有对方向我们发消息我们才能看到他的头像和昵称。


 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值