環信easeui集成:用戶昵稱和用戶頭像總結2018

来源:https://www.cnblogs.com/xqxacm/archive/2018/08/06/9429348.html
-Advertisement-
Play Games

環信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群探討。。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在MySQL中遇到分組排序查詢時,突然發現MySQL中沒有row_number() over(partition by colname)這樣的分組排序。並且由於MySQL中沒有類似於SQL Server中的row_number()、rank()、dense_rank()等排名函數,所有找到以下實 ...
  • 前言: 想把單行函數進行一個比較全面的總結,並分享給有需要的人,有不明之處還請多多指教。 SQL函數:Oracle的內置函數,包括了單行函數和多行函數,本文重點講解單行函數。單行函數又可以分為許多類,本人將常用的分為5大類: 字元函數(7個),數值函數(7個),日期函數(7個),轉換函數(3個),通 ...
  • 一.備份概述 數據安全是資料庫的生命,資料庫在使用過程中難免會遇到如:使用者的誤操作或是被惡意修改,硬體故障導致數據文件無法被訪問,自然災害導致機房在物理上的損毀。本章從備份與恢復的功能作為解決問題的切入點。在實際工作中會遇到:使用什麼樣的備份策略(比如完整備份,文件備份,差異備份,日誌備份),如何 ...
  • 數據表定義 數據表(或稱表)是資料庫最重要的組成部分之一,資料庫中以表為組織單位存儲數據,資料庫只是一個框架,數據表才是其實質內容。資料庫管理工具中可以顯示資料庫中的所有數據表,數據表是資料庫中一個非常重要的對象,是其他對象的基礎。 創建數據表 方式一:打開資料庫管理工具-》登錄-》選擇資料庫-》選 ...
  • 在目前相信大多數IT開發人員對於人工智慧+大數據並不陌生,使用的場景也越來越廣,日常開發中前端同學也逐漸接觸了更多與大數據相關的開發需求。因此對大數據知識也有必要進行一些學習理解。大數據學習資料分享群119599574 不管你是小白還是大牛,小編我都挺歡迎,今天的源碼已經上傳到群文件,不定期分享乾貨 ...
  • Android Fragment用法的講解 碎片,它的出現是為了更好展示UI的設計,讓程式更加得到充分的展示。 的出現,如微信的額主界麵包含多個 ,使得微信功能更加簡潔明瞭。 Fragment組件 是`Android 3.0 Fragment`實現更好的用戶體驗。 Fragment載入 1. 靜態加 ...
  • activity的生命周期 activity的四種狀態 running: 正在運行,處於活動狀態,用戶可以點擊屏幕,是將 處於棧頂的狀態。 paused: 暫停,處於失去焦點的時候,處於 ,可能是被如彈框一樣遮蓋,被通明的 的放置到棧頂, 一起狀態都存在。 stopped: 處於 狀態,是當前的 被 ...
  • 引言 在《iPhone User Guide for iOS 11.4》這本書中,介紹了iOS11的新特性。其中在Safari的章節中,介紹了Fill in forms。也就是當你在網頁登錄、註冊以及購買的時候,用戶可以通過鍵盤來填充網頁的表單、或者是Safari自己填充(前提是你開啟了AutoFi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...