Android环信爬坑指北(二)头像昵称好友备注显示
??在上一篇文章中提到了要在初始化的時候,設置用戶信息提供者類——EaseUserProfileProvider,用以獲取用戶信息。下面我們來看一下 EaseUserProfileProvider 是怎么發揮作用的。
1、首先 EaseUserProfileProvider 在哪里被調用了。
我們可以看到它是在 EaseUI 這個類中被定義的接口,
/*** User profile provider* @author wei**/public interface EaseUserProfileProvider {/*** return EaseUser for input username* @param username* @return*/EaseUser getUserInfo(String username); } 復制代碼封裝在了 EaseUserUtils 中使用:
public class EaseUserUtils {static EaseUserProfileProvider userProvider;static {userProvider = EaseUI.getInstance().getUserProfileProvider();}/*** get EaseUser according username* @param username* @return*/public static EaseUser getUserInfo(String username){if(userProvider != null)return userProvider.getUser(username);return null;}/*** set user avatar* 根據UserName設置控件頭像* @param username*/public static void setUserAvatar(Context context, String username, ImageView imageView){EaseUser user = getUserInfo(username);if(user != null && user.getAvatar() != null){try {Glide.with(context).load(user.getAvatar()).into(imageView;} catch (Exception e) {//use default avatar//替換Glide為4.0之后改變的方法。Glide.with(context).load(R.drawable.icon_my_personalinfo).into(imageView);}}else{Glide.with(context).load(R.drawable.icon_my_personalinfo).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.getNick() != null){textView.setText(user.getNick());}else{textView.setText(username);}}}……} 復制代碼??這里基于 getUserInfo 方法,又封裝了 setUserAvatar 方法設置用戶頭像,我們還可以封裝一些其他方法,例如設置用戶性別方法。
/*** set user sex* 根據UserName設置控件性別* @param username*/public static void setUserSex(Context context, String username, ImageView imageView){EaseUser user = getUserInfo(username);if(user != null && user.getSex() != 0){//1是男,2是女if (user.getSex() == 1) {Glide.with(context).load(R.drawable.icon_nan).into(imageView);}else if (user.getSex() == 2){Glide.with(context).load(R.drawable.icon_nv).into(imageView);}}} 復制代碼可以發現 setUserAvatar方法在 easeUI 的很多地方都用到,比較重要的幾個地方是:
??EaseChatRow 類中,即消息氣泡旁邊的用戶昵稱、頭像;
??EaseConversationAdapter 類中,即消息列表界面上的昵稱、頭像;
??EaseContactAdapter 類中,即聯系人列表。
在以上類中,我們可以重新繪制布局,添加自定義的控件,進行用戶信息的顯示。例如:
EaseConversationAdapter{……@Overridepublic View getView(int position, View convertView, ViewGroup parent) { …… //單聊// 不使用原easeUI代碼中環信賬戶做為昵稱// EaseUserUtils.setUserNick(username, holder.name);String remark = EaseUserUtils.getUserInfo(username).getRemark();if (!TextUtils.isEmpty(remark)){//如果有備注的話,顯示備注holder.name.setText(remark);}else {//顯示7個長度的昵稱String nickName = TextUtils.isEmpty(EaseUserUtils.getUserInfo(username).getNickname()) ? username : EaseUserUtils.getUserInfo(username).getNickname();nickName = nickName.length() > 7 ? nickName.substring(0, 6) : nickName;holder.name.setText(nickName);}//顯示自定義的控件holder.sex.setVisibility(View.VISIBLE);//增加setUserSex方法EaseUserUtils.setUserSex(getContext(),username,holder.sex);holder.motioned.setVisibility(View.GONE);} } 復制代碼布局部分很簡單,自己畫就可以了。以上都是在說我們獲取到用戶信息之后進行的操作,那么下面就是重點。
2、用戶信息的獲取以及本地存儲
請按以下步驟快速集成本地緩存用戶類:
(1)下載
環信簡版Demo
使用cache包中前三個類,注意是前三個類,前三個類,分別用于數據庫增刪改、用戶緩存類,緩存管理類。
其中 UserCacheInfo 中可以增加需要保存的屬性。
……/*備注*/@DatabaseFieldprivate String remark;/*性別*/@DatabaseFieldprivate int sex;……復制代碼(2)增加依賴庫
compile 'com.j256.ormlite:ormlite-android:5.0' compile 'com.google.code.gson:gson:2.8.0' 復制代碼ormlite:操作 sqlite 數據庫
gson:json 對象轉換
在 UserCacheManager.java 中注釋第57-68行代碼:
public static UserCacheInfo get(final String userId) {UserCacheInfo info = null;// 如果本地緩存不存在或者過期,則從存儲服務器獲取 // if (notExistedOrExpired(userId)){ // CommonLoader.get(userId, ) { // @Override // public void onCompleted(UserWebInfo info) { // if(info == null) return; // // // 緩存到本地 // // info.getOpenId() 為該用戶的【環信ID】 // save(info.getOpenId(), info.getNickName(),info.getAvatarUrl()); // } // }); // }// 從本地緩存中獲取用戶數據info = getFromCache(userId);return info;} 復制代碼(3)設置用戶信息提供者(setUserProfileProvider),實現 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// 從本地緩存中獲取用戶昵稱頭像EaseUser user = UserCacheManager.getEaseUser(username);return user;} 復制代碼public class UserCacheManager {……/*** 獲取用戶信息** @param userId* @return*/public static EaseUser getEaseUser(String userId) {UserCacheInfo user = get(userId);if (user == null) return null;EaseUser easeUser = new EaseUser(userId);easeUser.setRemark(user.getRemark());easeUser.setAvatar(user.getAvatarUrl());easeUser.setNickname(user.getNickName());easeUser.setSex(user.getSex());return easeUser;}…… } 復制代碼(4)登錄(或注冊)成功后,保存當前用戶的昵稱頭像。
在登錄(或注冊)自己服務器的回調方法(不是環信IM登錄回調)里,增加如下代碼:
// 登錄成功,將當前用戶的環信ID、備注、昵稱和頭像、性別保存在本地 UserCacheManager.save(userId, "", nickName, avatarUrl,sex); 復制代碼public class UserCacheManager {……public static boolean save(String userId,String remark ,String nickName, String avatarUrl, int sex) {try {Dao<UserCacheInfo, Integer> dao = SqliteHelper.getInstance().getUserDao();UserCacheInfo user = getFromCache(userId);// 新增if (user == null) {user = new UserCacheInfo();}//這是一個方便的方法,用于在數據庫中創建一個不存在的項目。從數據參數中提取id,并在數據庫上創建一個查詢-by-id。// 如果具有相同id的數據存在,那么該數據中的所有字段都將更新。user.setUserId(userId);user.setRemark(remark);user.setAvatarUrl(avatarUrl);user.setNickName(nickName);user.setSex(sex);//1男2女user.setExpiredDate(new Date().getTime() + 24 * 60 * 60 * 1000);// 1天過期,單位:毫秒Dao.CreateOrUpdateStatus status = dao.createOrUpdate(user);if (status.getNumLinesChanged() > 0) {Log.i("UserCacheManager", "操作成功~");return true;}} catch (Exception e) {e.printStackTrace();Log.e("UserCacheManager", "操作異常~");}return false;}…… } 復制代碼也可以先用以下隨機生成用戶昵稱頭像的代碼:
Random random=new Random(); String userId = EMClient.getInstance().getCurrentUser();// 用戶環信ID String nickName = String.format("小草%d",random.nextInt(10000));// 用戶昵稱 String avatarUrl = String.format("http://duoroux.com/chat/avatar/%d.jpg",random.nextInt(10));// 用戶頭像(絕對路徑) int sex = 1; UserCacheManager.save(userId, "", nickName, avatarUrl,sex); 復制代碼(5)發送消息時攜帶昵稱頭像
在實現了 EaseChatFragment.EaseChatFragmentHelper 接口的類中, onSetMessageAttributes() 函數,增加代碼:
// 設置消息的擴展屬性,攜帶昵稱頭像 UserCacheManager.setMsgExt(message); 復制代碼public class UserCacheManager {/*** 消息擴展屬性*/public static final String kChatUserId = "ChatUserId";// 環信IDpublic static final String kChatUserRemark = "ChatUserRemark";// 昵稱public static final String kChatUserNick = "ChatUserNick";// 昵稱public static final String kChatUserPic = "ChatUserPic";// 頭像Urlpublic static final String kChatUserSex = "ChatUserSex";//性別……/*** 設置消息的擴展屬性** @param msg 發送的消息*/public static void setMsgExt(EMMessage msg) {if (msg == null) return;UserCacheInfo user = getMyInfo();if (user == null || TextUtils.isEmpty(user.getUserId())) {ToastUtil.showShortToast("用戶沒有登錄,請重新登錄");return;}msg.setAttribute(kChatUserNick, user.getNickName());msg.setAttribute(kChatUserPic, user.getAvatarUrl());if (msg.getChatType() == EMMessage.ChatType.Chat) {msg.setAttribute(kChatUserId, user.getUserId());msg.setAttribute(kChatUserSex, user.getSex());}if (msg.getChatType() == EMMessage.ChatType.GroupChat) {//如果是群聊,保存群的用戶id。msg.setAttribute(kChatUserId, msg.conversationId());}}…… } 復制代碼(6)接收消息時攜帶昵稱頭像
在繼承了 EaseChatFragment 的類中重寫 onMessageReceived 函數,保存消息中的用戶信息:
@Overridepublic void onMessageReceived(List<EMMessage> messages) {for (EMMessage message : messages){EaseHelper.saveUserInfo(message);}super.onMessageReceived(messages);}復制代碼public class EaseHelper {……//保存用戶信息public static void saveUserInfo(EMMessage message){String userId = message.getFrom();String avatarUrl = message.ext().get(UserCacheManager.kChatUserPic).toString();String nickName = message.ext().get(UserCacheManager.kChatUserNick).toString();//1男2女,0表示沒有性別信息。int sex = 0;if (message.ext().get(UserCacheManager.kChatUserSex) != null){sex = Integer.valueOf(message.ext().get(UserCacheManager.kChatUserSex).toString());}if (UserCacheManager.getEaseUser(userId) != null){String remark = UserCacheManager.getEaseUser(userId).getRemark();UserCacheManager.save(userId,remark,nickName,avatarUrl,sex);}else{UserCacheManager.save(userId,"",nickName,avatarUrl,sex);}}……} 復制代碼三、補充說明
??除了以上在登錄之后和接受消息時保存用戶信息之外,還需要在修改好友備注之后進行保存,在請求好友資料時進行保存。另外,每個用戶對別人的備注都是不一樣的,所以不需要在消息中攜帶好友備注。
四、語音、視頻通話功能頭像昵稱處理(無此需求可忽略)
需要以下步驟:
1、發送音視頻通話請求時攜帶昵稱頭像。
CallActivity.java里第162行代碼更改為:
// 通過擴展屬性將昵稱頭像傳給對方 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第33行增加代碼:
// 緩存用戶昵稱頭像 String ext = EMClient.getInstance().callManager().getCurrentCallSession().getExt(); UserCacheManager.save(ext); 復制代碼3、音頻通話里顯示昵稱頭像。
VoiceCallActivity.java第114行代碼改為:
// 顯示昵稱頭像 UserCacheInfo user = UserCacheManager.get(username); if (user != null){nickTextView.setText(user.getNickName());//Glide.with(VoiceCallActivity.this).load(user.getAvatarUrl()).placeholder(R.drawable.em_default_avatar).into(avatarImage);}else {nickTextView.setText(username);} 復制代碼4、視頻通話里顯示昵稱頭像。
VideoCallActivity.java第171行代碼改為:
// 顯示昵稱頭像 UserCacheInfo user = UserCacheManager.get(username); if (user != null){nickTextView.setText(user.getNickName()); }else {nickTextView.setText(username); } 復制代碼總結
以上是生活随笔為你收集整理的Android环信爬坑指北(二)头像昵称好友备注显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Navicatfor mysql怎么设置
- 下一篇: 面对众多的前端框架,你该如何学习?