首先看下官方的介紹的方法:
http://docs.easemob.com/im/490integrationcases/10nickname
官方只是介紹了理論實現方法,然而呢,眾多小伙伴都是和我一樣的啊,我們都是信封拿來主義的啊
既然如此,我就寫這篇博客來記錄下我的辛酸歷程,供大家參考借鑒學習
我集成的只是easeui,並沒有把官方的demo代碼全部集成進去吶,這樣的話我需要啥子功能,自己去demo中摳就好啦,好啦,大家都是這么干的啦
easeui集成步驟呢,這里就不細說了啊,官方說明的還是比較清楚的啦,下面是關於集成成功后的昵稱和頭像的設置辦法
進入正題
一,首先看easeui中的代碼,EaseChatFragment.java類中有個內部接口類EaseChatFragmentHelper,呀,看到這,忽然明白如果想自定義擴展字段,需要先自己實現這個方法啊,那就趕緊開工自己寫個類繼承EaseChatFragment並且實現這個接口類啊,上圖看的真切些
@Override public void onSetMessageAttributes(EMMessage message) { if(isRobot){ //set message extension message.setAttribute("em_robot_message", isRobot); } //設置要發送擴展消息用戶昵稱 message.setAttribute(Constant.USER_NAME, "nike"); //設置要發送擴展消息用戶頭像 message.setAttribute(Constant.HEAD_IMAGE_URL, "http://img5.duitang.com/uploads/item/201508/30/20150830132007_TjANX.thumb.224_0.jpeg");
}
到此為止,就可以把昵稱和頭像發送出去啦
注意事項1:MyChatFragment實現了EaseChatFragmentHelper之后一定要調用EaseChatFragment中的setChatFragmentHelper(EaseChatFragmentHelper chatFragmentHelper)方法,調用地方截圖如下:
注意事項2:在easyui中,最終把昵稱和頭像顯示在控件上的代碼是在EaseUserUtils這個類中的setUserAvatar()方法和setUserNick()方法,截圖如下:
二,然后呢就是怎么接收昵稱和頭像啦,這個讓我找的挺費勁的
這個還得從easeui初始化的時候說起,大家都知道,環信初始化必須得在application類中進行初始化,那么就從這個類着手吧,
邊工作邊寫日志,想了想還是把代碼貼出來吧,關鍵代碼就是getUserInfo()方法中
public void init(Context context) { demoModel = new DemoModel(context); EMOptions options = initChatOptions(); //use default options if options is null if (EaseUI.getInstance().init(context, options)) { appContext = context; //獲取easeui實例 easeUI = EaseUI.getInstance(); //初始化easeui easeUI.init(appContext,options); //在做打包混淆時,關閉debug模式,避免消耗不必要的資源 EMClient.getInstance().setDebugMode(true); setEaseUIProviders(); //設置全局監聽 setGlobalListeners(); // broadcastManager = LocalBroadcastManager.getInstance(appContext); initDbDao(); } } private EMOptions initChatOptions(){ EMOptions options = new EMOptions(); // set if accept the invitation automatically options.setAcceptInvitationAlways(false); // set if you need read ack options.setRequireAck(true); // set if you need delivery ack options.setRequireDeliveryAck(false); return options; } protected void setEaseUIProviders() { // set profile provider if you want easeUI to handle avatar and nickname easeUI.setUserProfileProvider(new EaseUI.EaseUserProfileProvider() { @Override public EaseUser getUser(String username) { return getUserInfo(username); } }); } private EaseUser getUserInfo(String username){ //獲取 EaseUser實例, 這里從內存中讀取 //如果你是從服務器中讀讀取到的,最好在本地進行緩存 EaseUser user = null; //如果用戶是本人,就設置自己的頭像 if(username.equals(EMClient.getInstance().getCurrentUser())){ user=new EaseUser(username); user.setAvatar((String)SharedPreferencesUtils.getParam(appContext,APPConfig.USER_HEAD_IMG,"")); user.setNick((String)SharedPreferencesUtils.getParam(appContext, APPConfig.USER_NAME,"nike")); return user; } // if (user==null && getRobotList()!=null){ // user=getRobotList().get(username); // } //收到別人的消息,設置別人的頭像 if (contactList!=null && contactList.containsKey(username)){ user=contactList.get(username); }else { //如果內存中沒有,則將本地數據庫中的取出到內存中 contactList=getContactList(); user=contactList.get(username); } //如果用戶不是你的聯系人,則進行初始化 if(user == null){ user = new EaseUser(username); EaseCommonUtils.setUserInitialLetter(user); }else { if (TextUtils.isEmpty(user.getAvatar())){//如果名字為空,則顯示環信號碼 user.setNick(user.getUsername()); } } Log.i("zcb","頭像:"+user.getAvatar()); return user; } private void initDbDao() { inviteMessgeDao = new InviteMessgeDao(appContext); userDao = new UserDao(appContext); } public Map<String, RobotUser> getRobotList() { if (isLoggedIn() && robotList == null) { robotList = demoModel.getRobotList(); } return robotList; } /** * get current user's id */ public String getCurrentUsernName(){ if(username == null){ username = (String)SharedPreferencesUtils.getParam(appContext, Constant.HX_CURRENT_USER_ID,""); } return username; } /** *獲取所有的聯系人信息 * * @return */ public Map<String, EaseUser> getContactList() { if (isLoggedIn() && contactList == null) { contactList = demoModel.getContactList(); } // return a empty non-null object to avoid app crash if(contactList == null){ return new Hashtable<String, EaseUser>(); } return contactList; } /** * if ever logged in * * @return */ public boolean isLoggedIn() { return EMClient.getInstance().isLoggedInBefore(); } /** * set global listener */ protected void setGlobalListeners(){ registerMessageListener(); } /** * Global listener * If this event already handled by an activity, you don't need handle it again * activityList.size() <= 0 means all activities already in background or not in Activity Stack */ protected void registerMessageListener() { messageListener = new EMMessageListener() { private BroadcastReceiver broadCastReceiver = null; @Override public void onMessageReceived(List<EMMessage> messages) { for (EMMessage message : messages) { EMLog.d(TAG, "onMessageReceived id : " + message.getMsgId()); //接收並處理擴展消息 String userName=message.getStringAttribute(Constant.USER_NAME,""); String userId=message.getStringAttribute(Constant.USER_ID,""); String userPic=message.getStringAttribute(Constant.HEAD_IMAGE_URL,""); String hxIdFrom=message.getFrom(); System.out.println("helper接收到的用戶名:"+userName+"helper接收到的id:"+userId+"helper頭像:"+userPic); EaseUser easeUser=new EaseUser(hxIdFrom); easeUser.setAvatar(userPic); easeUser.setNick(userName); //存入內存 getContactList(); contactList.put(hxIdFrom,easeUser); //存入db UserDao dao=new UserDao(appContext); List<EaseUser> users=new ArrayList<EaseUser>(); users.add(easeUser); dao.saveContactList(users); // in background, do not refresh UI, notify it in notification bar // if(!easeUI.hasForegroundActivies()){ // getNotifier().onNewMsg(message); // } } } @Override public void onCmdMessageReceived(List<EMMessage> messages) { for (EMMessage message : messages) { EMLog.d(TAG, "receive command message"); //get message body //end of red packet code //獲取擴展屬性 此處省略 //maybe you need get extension of your message //message.getStringAttribute(""); } } @Override public void onMessageRead(List<EMMessage> messages) { } @Override public void onMessageDelivered(List<EMMessage> message) { } @Override public void onMessageChanged(EMMessage message, Object change) { } }; EMClient.getInstance().chatManager().addMessageListener(messageListener); }
至此可以正常顯示自己和對方的頭像和昵稱了。
源碼:https://github.com/zhangchunbin/HuanXinDemo
測試賬號: 用戶名:test 密碼:123456
用戶名 test1 密碼:123456
歡迎吐槽...