社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
方法二:从消息扩展中获取昵称和头像 昵称和头像的获取:把用户基本的昵称和头像的URL放到消息的扩展中,通过消息传递给接收方,当收到一条消息时,则能通过消息的扩展得到发送者的昵称和头像URL,然后保存到本地数据库和缓存。当显示昵称和头像时,请从本地或者缓存中读取,不要直接从消息中把赋值拿给界面(否则当用户昵称改变后,同一个人会显示不同的昵称)。 昵称和头像的更新:当扩展消息中的昵称和头像 URI 与当前本地数据库和缓存中的相应数据不同的时候,需要把新的昵称保存到本地数据库和缓存,并下载新的头像并保存到本地数据库和缓存。
/***************** 环信用户缓存信息 *******************************/ public static final String ChatUserId = "ChatUserId";// 用户的环信ID public static final String ChatUserPic = "ChatUserPic"; public static final String ChatUserNick = "ChatUserNick"; /***************** 环信用户缓存信息***********end ********************/
/** * 缓存用户信息(主要用于聊天显示昵称和头像) */ 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发送消息时,要在消息扩展里附带用户信息,代码写在
@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(); } }有不当之处,欢迎指正~~~谢谢
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!