美文网首页工作生活
Android环信修改头像和昵称

Android环信修改头像和昵称

作者: 大鹏的鹏 | 来源:发表于2019-07-02 11:25 被阅读0次

一.修改头像和昵称

方法一:从APP服务器获取昵称和头像

  • 昵称和头像的获取:当收到一条消息(群消息)时,得到发送者的用户ID,然后查找手机本地数据库是否有此用户ID的昵称和头像,如没有则调用APP服务器接口通过用户ID查询出昵称和头像,然后保存到本地数据库和缓存,下次此用户发来信息即可直接查询缓存或者本地数据库,不需要再次向APP服务器发起请求。

  • 昵称和头像的更新:当点击发送者头像时加载用户详情时从APP服务器查询此用户的具体信息然后更新本地数据库和缓存。当用户自己更新昵称或头像时,也可以发送一条透传消息到其他用户和用户所在的群,来更新该用户的昵称和头像。

方法二:从消息扩展中获取昵称和头像

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

  • 昵称和头像的更新:当扩展消息中的昵称和头像与当前本地数据库和缓存中的相应数据不同的时候,需要把新的昵称保存到本地数据库和缓存,并下载新的头像并保存到本地数据库和缓存。

昵称或头像处理的方法一和方法二区别:

  • 方法一:在发送消息时不含有任何扩展,收消息时如果本地不存在发送人的用户信息则需要从APP服务器查询发送人的昵称和头像的 URL。

  • 方法二:在发送消息时带有包含昵称和头像 的消息扩展,收到消息时即可从消息扩展中取出,不需要再去 APP 服务器获取。

方法二和方法一相比:

  • 优点:收到消息立即显示昵称不用等待APP服务器返回数据后显示。

  • 缺点:每条消息都要带有扩展,增加消息体积,每次发消息都有一些不必要的数据。

方法二步骤:

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

EMClient.getInstance().login(currentUsername, currentPassword, 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
            }

            @Override
            public void onProgress(int progress, String status) {
                Log.d(TAG, "login: onProgress");
            }

            @Override
            public void onError(final int code, final String message) {
                Log.d(TAG, "login: onError: " + code);
            }
        });

2.使用扩展消息将自己的头像昵称等信息发送出去,在ChatFragment类中有一个扩展属性的说明,把你要发送的内容附加能容添加上去:

  @Override
    public void onSetMessageAttributes(EMMessage message) {
        if (isRobot) {
            // 设置消息扩展属性
            message.setAttribute("em_robot_message", isRobot);
        }

        // 通过扩展属性,将userPic和userName发送出去。
        String userPic = AppSPUtils.getValueFromPrefrences("userPic", "");
        if (!TextUtils.isEmpty(userPic)) {
            message.setAttribute("userPic", userPic);
        }
        String userName = AppSPUtils.getValueFromPrefrences("userName", "");
        if (!TextUtils.isEmpty(userName)) {
            message.setAttribute("userName", userName);
        }
    }

3.在DemoHelper找到全局消息监听类,复写onMessageReceived的方法,将接收到的内容保存起来.

  @Override
            public void onMessageReceived(List<EMMessage> messages) {
                for (EMMessage message : messages) {
                    EMLog.d(TAG, "onMessageReceived id : " + message.getMsgId());
                    // 判断一下是否是会议邀请
                    String confId = message.getStringAttribute(Constant.MSG_ATTR_CONF_ID, "");
                    if (!"".equals(confId)) {
                        String password = message.getStringAttribute(Constant.MSG_ATTR_CONF_PASS, "");
                        String extension = message.getStringAttribute(Constant.MSG_ATTR_EXTENSION, "");
                        goConference(confId, password, extension);
                    }
                    // in background, do not refresh UI, notify it in notification bar
                    if (!easeUI.hasForegroundActivies()) {
                        getNotifier().notify(message);
                    }

                    //************接收并处理扩展消息***********************
                    String userName = message.getStringAttribute("userName", "");
                    String userPic = message.getStringAttribute("userPic", "");
                    String hxIdFrom = message.getFrom();
                    EaseUser easeUser = new EaseUser(hxIdFrom);
                    easeUser.setAvatar(userPic);
                    easeUser.setNickname(userName);

                    // 存入内存
                    getContactList();
                    contactList.put(hxIdFrom, easeUser);
                    // 存入db
                    UserDao dao = new UserDao(MainApplication.getContext());
                    
                    dao.saveContact(easeUser);

                    getModel().setContactSynced(true);

                    // 通知listeners联系人同步完毕
                    notifyContactsSyncListener(true);
                    // ******************扩展信息处理完成**********************
                }
            }

4.在DemoHelper中,找到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
        if (username.equals(EMClient.getInstance().getCurrentUser())) {
            EaseUser currentUserInfo = getUserProfileManager().getCurrentUserInfo();
            return currentUserInfo;
        }
        EaseUser easeUser;
        if (contactList != null && contactList.containsKey(username)) {

        } else { // 如果内存中没有,则将本地数据库中的取出到内存中。
            getContactList();
        }
        // // TODO 获取不在好友列表里的群成员具体信息,即陌生人信息,demo未实现
        // if (user == null && getRobotList() != null) {
        // user = getRobotList().get(hxId);
        // }
        easeUser = contactList.get(username);
        if(easeUser == null){
            easeUser = new EaseUser(username);
        } else {
            if(TextUtils.isEmpty(easeUser.getNickname())){ // 如果名字为空,则显示环信号码
                easeUser.setNickname(easeUser.getUsername());
            }
        }
        return easeUser;
    }

5.最终把昵称和头像显示在控件上的代码是在EaseUserUtils这个类中的setUserAvatar()方法和setUserNick()方法。

 /**
     * set user avatar
     * @param username
     */
    public static void setUserAvatar(Context context, String username, ImageView imageView){
        EaseUser user = getUserInfo(username);
        if(user != null && user.getAvatar() != null){
            try {
                int avatarResId = Integer.parseInt(user.getAvatar());
                Glide.with(context).load(avatarResId).into(imageView);
            } catch (Exception e) {
                //use default avatar
                Glide.with(context).load(user.getAvatar())
                        .apply(RequestOptions.placeholderOf(R.drawable.ease_default_avatar)
                                .diskCacheStrategy(DiskCacheStrategy.ALL))
                        .into(imageView);
            }
        }else{
            Glide.with(context).load(R.drawable.ease_default_avatar).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.getNickname() != null){
                textView.setText(user.getNickname());
            }else{
                textView.setText(username);
            }
        }
    }

二.修改音视频通话头像和昵称.

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

CallActivity.java里修改如下:

// 通过扩展属性将昵称头像传给对方
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里修改如下:

// 缓存用户昵称头像
String ext = EMClient.getInstance().callManager().getCurrentCallSession().getExt();
//加入到头像和昵称数据库中

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

VoiceCallActivity.java里修改如下:

        //有昵称则显示昵称
        EaseUserUtils.setUserAvatar(this, username,ivUserFace);
        EaseUserUtils.setUserNick(username, nickTextView);

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

VoiceCallActivity.java里修改如下:

        //有昵称则显示昵称
        EaseUserUtils.setUserAvatar(this, username,ivUserFace);
        EaseUserUtils.setUserNick(username, nickTextView);

相关文章

网友评论

    本文标题:Android环信修改头像和昵称

    本文链接:https://www.haomeiwen.com/subject/iiczcctx.html