android中如何显示开发者服务器上的昵称和头像 二

无论是IOS还是安卓,集成环信SDK遇到的第一个问题,就是如何显示自有用户体系中的昵称和头像。运行环信的demo app,注册用户是直接使用环信ID(username)作为用户名,但是在我们实际应用中,需要将自有用户体系的UserId生成GUID作为环信ID(username)
【参考:http://docs.easemob.com/im/100serverintegration/20users】,
这时候如果不经过处理,则会显示如下界面:


这里写图片描述


那么如何处理,才能显示正确的用户昵称和头像呢?
其实官方已经提供有解决方案了,只不过没有给出示例代码而已。
http://docs.easemob.com/im/490integrationcases/10nickname


引用一下关键文字:

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

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


没错,官方提供了两种思路,鉴于项目的实际情况,我选择了【方法二】。

于是,无论安卓,还是IOS,我们都是这样处理的:
【1】.APP间传递用户属性信息:发送(文本、图片…)消息时,要在消息扩展(message.ext)中附带当前用户的属性信息;
【2】.本地缓存用户信息:在接收消息的回调函数里,读取消息扩展(message.ext)里用户属性(键值对)信息;如果本地缓存(sqlite)不存在该用户,则新增缓存记录,如果存在,则更新记录;(用户登录或注册成功后,也要更新用户缓存信息)
【3】.获取用户属性信息:在需要显示昵称的地方,根据环信ID,读取sqlite缓存数据,获取用户昵称和头像;

用户属性信息:ChatUserId(环信ID),ChatUserNick(用户昵称), ChatUserPic(用户头像,完整的url地址);


关键代码:

/***************** 环信用户缓存信息 *******************************/
    public static final String ChatUserId = "ChatUserId";// 用户的环信ID
    public static final String ChatUserPic = "ChatUserPic";
    public static final String ChatUserNick = "ChatUserNick";
/***************** 环信用户缓存信息***********end ********************/

UserInfoCacheSvc.java是环信用户信息缓存管理类

/**
 * 缓存用户信息(主要用于聊天显示昵称和头像)
 */
public class UserInfoCacheSvc {
    public static List<UserApiModel> getAllList(){
        Dao<UserApiModel, Integer> daoScene = SqliteHelper.getInstance().getUserDao();
        try {
            List<UserApiModel> list = daoScene.queryBuilder().query();
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static UserApiModel getByChatUserName(String chatUserName){
        Dao<UserApiModel, Integer> dao = SqliteHelper.getInstance().getUserDao();
        try {
            UserApiModel model = dao.queryBuilder().where().eq("EaseMobUserName", chatUserName).queryForFirst();
            return model;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static UserApiModel getById(long id){
        Dao<UserApiModel, Integer> dao = SqliteHelper.getInstance().getUserDao();
        try {
            UserApiModel model = dao.queryBuilder().where().eq("Id", id).queryForFirst();
            return model;
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static boolean createOrUpdate(String chatUserName, String userNickName, String avatarUrl){
        try {
            Dao<UserApiModel, Integer> dao = SqliteHelper.getInstance().getUserDao();

            UserApiModel user = getByChatUserName(chatUserName);

            int changedLines = 0;
            if (user == null){
                user = new UserApiModel();
                user.setUsername(userNickName);
                user.setHeadImg(avatarUrl);
                user.setEaseMobUserName(chatUserName);

                changedLines = dao.create(user);
            }else {
                user.setUsername(userNickName);
                user.setHeadImg(avatarUrl);
                user.setEaseMobUserName(chatUserName);

                changedLines = dao.update(user);
            }

            if(changedLines > 0){
                Log.i("UserInfoCacheSvc", "操作成功~");
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            Log.e("UserInfoCacheSvc", "操作异常~");
        }

        return false;
    }

    public static boolean createOrUpdate(UserApiModel model){

        if(model == null) return false;

        try {
            Dao<UserApiModel, Integer> dao = SqliteHelper.getInstance().getUserDao();

            UserApiModel user = getById(model.Id);

            if (!StringUtils.isNullOrEmpty(model.getHeadImg())){
                String fullPath = "http://image.baidu.com"  +  model.getHeadImg();
//特别注意:这里用是图片的完整链接地址,如果要取缩略图,需要服务端配合;

                model.setHeadImg(fullPath);
            }
            int changedLines = 0;
            if (user == null){
                changedLines = dao.create(model);
            }else {
                model.setRecordId(user.getRecordId());
                changedLines = dao.update(model);
            }

            if(changedLines > 0){
                Log.i("UserInfoCacheSvc", "操作成功~");
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            Log.e("UserInfoCacheSvc", "操作异常~");
        }

        return false;
    }

}

首先要在用户登录或注册成功后,返回用户登录信息Model时,缓存一下用户信息,@DatabaseField注解是ormlite库的特性,文章后面的附件包含了此类库:

public class UserApiModel implements Serializable {

@DatabaseField(generatedId=true)
private int RecordId;

@DatabaseField

public long Id;

@DatabaseField
public String Username;

@DatabaseField
public String Email;

@DatabaseField
public String HeadImg;

@DatabaseField
public String EaseMobUserName;

@DatabaseField
public String EaseMobPassword;
}

private static void SaveUserInfo(UserApiModel userInfo){

    if(userInfo == null) return;

    // 缓存用户信息
    PrefUtils.setUserId(userInfo.Id);
    PrefUtils.setUserEmail(userInfo.Email);
    PrefUtils.setUserName(userInfo.Username);
    PrefUtils.setUserPic(userInfo.HeadImg);
    PrefUtils.setUserChatId(userInfo.EaseMobUserName);
    PrefUtils.setUserChatPwd(userInfo.EaseMobPassword);

    UserInfoCacheSvc.createOrUpdate(userInfo);
}

然后在接收环信消息的回调函数里保存用户信息,ActyMain.java是我们项目的主框架,我们在这里写了回调函数,无论群聊还是单聊消息,都会调用这里:

private EMMessageListener mMessageListener = new EMMessageListener() {

        @Override
        public void onMessageReceived(List<EMMessage> messages) {
            // 提示新消息
            for (EMMessage message : messages) {

                // 先将头像和昵称保存在本地缓存
                try {
                    String chatUserId = message.getStringAttribute(SharePrefConstant.ChatUserId);
                    String avatarUrl = message.getStringAttribute(SharePrefConstant.ChatUserPic);
                    String nickName = message.getStringAttribute(SharePrefConstant.ChatUserNick);

                    UserInfoCacheSvc.createOrUpdate(chatUserId, nickName, avatarUrl);

                } catch (HyphenateException e) {
                    e.printStackTrace();
                }

                ChatHelper.getInstance().getNotifier().onNewMsg(message);
            }
            refreshUIWithMessage();
        }

        // 此处省略N行代码....
    };

在安卓项目里,环信页面显示昵称和头像时,都会统一从DemoHelper的getUserInfo函数里获取信息,所以我们要在这里从缓存取用户头像和昵称:

private EaseUser getUserInfo(String username){
        //获取user信息,demo是从内存的好友列表里获取,
        //实际开发中,可能还需要从服务器获取用户信息,
        //从服务器获取的数据,最好缓存起来,避免频繁的网络请求
        EaseUser user = null;
        // 从缓存里取昵称和头像
        UserApiModel userInfo = UserInfoCacheSvc.getByChatUserName(username);
        if (userInfo != null){
            user = new EaseUser(username);
            user.setAvatar(userInfo.getHeadImg());
            user.setNick(userInfo.getUsername());
        }

        return user;
}

最后,为了让另外一个客户端也能正确显示头像和昵称,app发送消息时,要在消息扩展里附带用户信息,代码写在
ChatFragment.java里: 在这里我提醒下大家,要判断这个头像是自己的还是好友的

 @Override
    public void onSetMessageAttributes(EMMessage message) {
        setUserInfoAttribute(message);
    }

    /**
     * 设置用户的属性,
     * 通过消息的扩展,传递客服系统用户的属性信息
     * @param message
     */
    private void setUserInfoAttribute(EMMessage message) {
        try {
            message.setAttribute(SharePrefConstant.ChatUserId, PrefUtils.getUserChatId());
            message.setAttribute(SharePrefConstant.ChatUserNick, PrefUtils.getUserName());
            message.setAttribute(SharePrefConstant.ChatUserPic, "http://image.baidu.com" + PrefUtils.getUserPic()) ;//这里用是图片的完整链接地址,如果要取缩略图,需要服务端配合;

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

怎么判断呢,作为新手的我们,我推荐使用shareprefences在登陆的时候保存下自己的头像昵称,然后再这里获取,并且设置给扩展

这里写图片描述


在demohelper里面有个getuserinfo方法

这里写图片描述


这里就是把获取到的头像昵称设置给环信,然后显示出来,这里最重要,切记不要写错。

那么,到此为止,其实都说完了,可是,毕竟是一个延伸,怎么可能就此结束,接下来给大家看下,请求数据,然后设置给数据库

这里写图片描述


请求的过程我就不写了,这个大家都会,获取到username,id,logo,之后先要把头像,昵称存到userdao里面,如果userdao是环信的一个数据库,这个大家自己看看demo的代码就知道了,设置到这里,是为了在联系人列表里面显示,UserInfoCacheSvc.createOrUpdate(id,username,logo_img);这句就是把头像昵称放到数据库里面


最后,补充一下,忘记说了,导入框架
这里写图片描述


相关文件下载地址:
http://download.csdn.net/detail/q9104422999/9661218

原文地址 :
http://www.imgeek.org/article/825307856
http://www.imgeek.org/article/825308239

安卓交流群 : 595856941

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值