環信EaseUI 集成,集成不做描述,看文檔即可,下麵主要談一些對easeui的個性化需求修改。 一、如何將App用戶體系的用戶名和用戶頭像 顯示於環信的easeui 這個問題是所有人都想解決的,集成easeui之後 ,雖然大部分功能給我們做好了,但是他是顯示的環信用戶體系的用戶名和預設的頭像。 這 ...
環信EaseUI 集成,集成不做描述,看文檔即可,下麵主要談一些對easeui的個性化需求修改。
一、如何將App用戶體系的用戶名和用戶頭像 顯示於環信的easeui
這個問題是所有人都想解決的,集成easeui之後 ,雖然大部分功能給我們做好了,但是他是顯示的環信用戶體系的用戶名和預設的頭像。
這個用戶名是唯一的,官方提供了兩種方式來解決。這裡我們使用用戶發送消息攜帶擴展信息的方式來實現。
首先看一下環信的用戶體系,用戶名(唯一值,easeui中顯示的用戶名就是他,實際上,我們自己資料庫的用戶體系中,就把用戶的唯一id作為環信的用戶名)
環信的用戶名 == 後臺資料庫的id , 目的保證唯一值,區分用戶信息
App端 需要一個資料庫,每一個記錄有三個欄位: id ,userName, userAvatar
實現思路:
1、發送消息的時候(一般是當前登錄用戶,取名用戶A) ,將項目後臺用戶A的id、頭像url和用戶名字元串作為消息的擴展屬性一併發送出去
找到EaseChatFragment文件
大致看一下,該行數範圍內的代碼,很明顯是一個個發送各種類型消息的方法,方法內最後都調用了sendMessage()方法,
顯然我們需要在sendMessage()方法內 給 消息(message) 添加擴展屬性即可 ,如下圖
添加了932-935行代碼,實現了當app當前登錄用戶每次發消息(不管什麼類型的消息)都會添加3個擴展屬性,分別為發出人的用戶名,用戶頭像,用戶id
(註意,這個id要在自己的伺服器數據里是唯一的,一個用戶一個id,用時要求後端開發人員在環信用該id在環信用戶體系裡作為唯一的用戶名,保證自己伺服器里一個用戶對於環信用戶體系裡的一個用戶)
總結:
第一步,給每個發出去的消息添加3個擴展屬性
2、發送方處理好了,只需要給每個發出去的消息添加3個擴展屬性即可,接下來就是收消息方的處理
這裡每個用戶大致有3個主要界面,會話歷史界面,聯繫人界面,單聊視窗界面。
其中會話歷史列表界面和聯繫人界面類似,下麵只以會話歷史列表界面為例,實現用戶頭像和用戶名的顯示
會話歷史界面對應的是EaseConversationListFragment界面。
閱讀下代碼,裡面有一個refresh()方法,很現實就是更新列表的方法。
註意的是,該fragment裡面是沒有監聽消息更新的listener,則第一步先根據文檔在該fragment裡面添加一個消息監聽
同時,註冊和註銷監聽
仔細看一個EMMessageListener 裡面有一個onMessageReceived(List<Message> message){}回調
很顯然,當有消息收到的時候,會執行該方法回調,同時把消息數據返回,註意這裡的消息是一個集合的消息數據
結合第一步發出去的每一個消息都帶有發送人的用戶名,用戶頭像,用戶唯一id 三個信息,則這裡只需要把三個信息從每一個消息message裡面提取出來即可
代碼很簡單,註意這裡需要用到資料庫的知識,我這裡使用的是 greendao , 關於資料庫的學習這裡就不說了,不會的童鞋可以自行去學習
總結:
第二步 就是一個獲取每一個消息中的擴展屬性,知道這個每一條消息是哪個用戶發來的,他的用戶名用戶頭像用戶唯一id都可以獲取到,然後存儲到資料庫中
3、上面兩步很明顯了, 一個是告訴對方 我叫什麼、我的頭像信息、我的唯一id,一個是接收方,得到每一個消息的擴展屬性進行資料庫存儲。
該流程下第三步就很明顯了,就是把存儲的資料庫信息中獲取消息所屬用戶id的頭像和名字 顯示在界面上即可(id作為唯一標準)。
①、以會話歷史列表界面(EaseConversationListFragment)為例,聯繫人界面類似
找到那行關鍵代碼:refresh()
handler發送了一個消息,繼續找對該消息的處理
很顯然,當有消息來的時候,先清空消息列表,然後載入當前消息,刷新listview
看一下conversationListView.refresh()做了什麼? ctrl+滑鼠左鍵點擊該方法代碼進入了 EaseConversationList.java
依舊是handler發送一個消息,繼續查詢對該消息的處理
最後定位到了adapter.notifyDataSetChanged(),刷新列表 ,定位到EaseConversationAdapter
總結一下,當有新消息來的時候,刷新適配器。
到這裡很顯然知道該怎麼做了,刷新適配器的時候,更改ui即可了
兩個if一個else,只需要改else裡面部分即可,為啥? 看註釋
①、從資料庫中根據id獲取用戶的頭像和昵稱
如果資料庫中沒有 ,則用預設的昵稱和頭像
如果資料庫中油 ,則顯示,註意,
可以看出原來easeui顯示的用戶名是環信系統裡面的用戶名,實際上我們把它作為資料庫的id,用該id對應的用戶名來顯示
顯示用戶名改為:
②、用戶名很簡單,把原本顯示id的改為顯示id對應的用戶名字元串的即可
頭像呢,定位到EaseUserUtils.setUserAvatar()方法,如下,是easeui原來的使用方式,可以看到都用了一個預設的圖片來顯示頭像
則我們只需要對應在EaseUserUtils裡面寫一個定製的顯示頭像的方法 , 將第二個參數 把從資料庫對應id取出的記錄中的頭像url替換,顯示
註意,這裡Glide的使用,添加了一個.dontAnimate()的使用,用於解決特定情況下第一個不會正常顯示圖片的情況,算是一個小bug,可根據自身情況添加。
總結:想要在會話歷史列表顯示實際的頭像和用戶名 只需要在list對應的adapter修改顯示ui的部分代碼即可。
4、還剩一個關鍵的界面,將頭像和用戶名顯示出來,就是會話界面 EaseChatFragment
這個界面需要修改的部分:
①標題,修改為聊天對象的用戶名,預設是環信用戶體系中聊天用戶的用戶名,即資料庫存的三個擴展屬性的id
②發送的消息,即app當前用戶發出去的item的頭像和用戶名,右側部分
③接受的消息,即app其他用戶發過來的item的頭像和用戶名,左側部分
下麵按順序解決,
先定位到聊天界面的layout : ease_fragment_chat.xml
如上圖,就幾個view
很顯然,EaseTitleBar 就是聊天界面上的標題
其他,EaseChatMessageList是聊天item的列表
主要修改這兩處view的使用
ctrl+滑鼠左鍵定位到EaseTitleBar這個自定義控制項位置
在ctrl+滑鼠左鍵點擊EaseTitleBar看一下這個控制項哪裡有用到
跟聊天有關,那很顯然就是EaseBaseFragment了,查看一下該文件代碼,這個fragment是一個抽象類,有兩個方法initview setUpView ,而EaseChatFragment繼承了該類
則再回到easeChatFragment裡面 查詢一下setUpView 和 initView的使用
到這裡就很顯然了, 這便是單聊情況下的if
easeui原代碼是灰色註釋掉的部分,可以看到titleBar顯示的是用戶的用戶名,即環信用戶體系中的用戶名,而我們把他作為id,唯一值
所以在這裡還是根據這個id來去資料庫中找尋id對應的用戶名 setTitle()進去即可,修改聊天界面標題為對方用戶名就是這麼簡單。
接下來是修改聊天界面的發送方和接收方的頭像問題。
這個具體找到代碼的思路就不介紹了,比較麻煩,直接定位到想要代碼吧
這裡就是各種類型的消息的item的自定義控制項,都繼承自EaseChatRow類
然後研究一下EaseChatRow類 ,發現了關鍵代碼
比較容易看懂,當消息是發出去的時候,調用了一個現實頭像的方法,當消息是接收的時候,定義了一個現實頭像和用戶名的方法
那解決方法,就是從該處在資料庫中根據id獲取到頭像和用戶名的數據顯示即可。
思路如此,不在細講
二、如何從library中調用app中的方法?
當依賴easeui的時候,是用import module的形式導入的,所以主程式是可以調用easeui類庫中的類和方法,但是反之不行
當資料庫操作的時候,發現該問題,解決辦法就是反射調用,具體查詢相關文章
三、easeui頭像都是方形的,如果修改為原型顯示?
找一個用到顯示頭像的xml代碼
可以看到easeui使用了一個自定義控制項來顯示EaseImageView
查看該控制項源碼:
發現
說明該控制項的shapeType屬性是來控製圖片是方形顯示還是圓形顯示的。
查詢源碼發現init()方法對該屬性進行了初始話,預設值為0 ,如果想圓形顯示,則改為1即可
如此一來,不該顯示圖片的控制項,不該每一個調用控制項的自定義屬性 即可實現統一圓形顯示。
其他註意點:
1、環信用戶註冊需要交給伺服器註冊用戶的同時去註冊
2、環信登錄和註銷sdk的使用在App 客戶端實現,同步於App用戶的登錄和退出
3、第一次會話發起的時候,此時發消息的和收消息的用戶的數據可能不在資料庫中存在,需要在這個情景之下單獨先進行雙方的數據存儲
4、上面講到一個接收到新消息的回調方法 onMessageReceived
會有一種情況。B用戶尚未登錄APP, A用戶給B用戶發了消息(兩個用戶之間是第一次會話,並且是A給B發起的會話,也就是說B用戶那邊是沒有資料庫存儲A用戶的三個信息的),B用戶登錄消息之後 會有消息列表,但是因為沒有執行
onMessageReceived 方法,導致沒有對A用戶的消息中的擴展數據進行資料庫存儲,所以會導致B用戶這邊會話列表中A用戶的頭像和用戶名顯示不出,解決辦法 定位到EaseConversationListFragment類中的 loadConversationList 方法
查看源碼得知會話列表刷新的時候都會執行,那就在這個方法中對所有的消息的擴展欄位進行資料庫存儲,且只有第一次創建該fragment的時候才執行存儲
onCreate()中
boolean isLoadData = false; // 是否已經緩存了數據 用於界面剛登陸的時候 對之前接受到的數據的處理
--------------------------------------------------------------------------------------------------------------------------------------------------------
有問題歡迎加Android群探討。。