先申明筆者的實現方式不是唯一 也不一定是最優化的方案 如果您看到此篇博文 有不同看法 或者 更好的優化 更高的效率 歡迎在評論發表意見?融云官網點我
融云頭像機制相關視頻詳解
首先跟大家說一下 kit 跟 lib 的頭像機制 kit 是已經包含融云已經給開發者定制好的界面 諸如 會話界面 會話列表 1.0+版本還有好友列表 設置頁面等 lib 是通訊能力庫 所以開發者如果是基于 lib 開發 本篇博文對你來說就是不適用的 因為 lib 是自己去實現聊天界面 頭像 和 昵稱的展示就需要你自己去做管理了
token:
這邊還需要跟大家引入一下 ?token 的概念 您也可以參閱?OAuth2.0協議?, 對于用戶來說 是沒有 token ?這個概念的 他們只有 帳號 密碼 昵稱 頭像等 , 但是對于開發者來說 token 是您連接融云 服務器的身份令牌 你必須要有 token 才能連接到融云 服務器 ?而且 token 是唯一的 就跟你的 userid 一樣是一一對應的
關于token的獲取 ?目前融云 提供了兩種獲取方式:
1: 在你還在做測試 或者 你的 server 還沒有搭建好的時候 可以去融云官網 ?登錄你的開發者帳號 在 API 調試平臺進行token獲取 見下圖:
點擊以后 ?在該頁面下方 ?會返回一個模擬的 json 竄 給你 ?如果 提示 200 就是表示獲取token成功 你即可以把 json 中的 token 摘取出來
自己保存以后 留作測試用
2 測試完畢 或者服務器已經搭建好了 需要動態獲取 token ,這個時候的一個邏輯就是 ?您的 server 服務器 找融云服務器 獲取 token
(詳情見官網server文檔),然后您的服務器
提供接口給你的客戶端 去請求 這個token ,有小部分開發者疑惑為什么一定要自己的服務器 這點是必須有的 獲取 token 只是
服務器最基本的功能 還有很多 你自身的邏輯需要有 server 去維護
注:不管您是通過測試平臺獲取 token 還是 服務端 找 融云 server 獲取 token 時候 有三個值 ?userid ?username portraitUri 這邊
強烈建議您把 昵稱 和 頭像都填上
name&portrait:
用戶信息提供者: 1.0+ setGetUserInfoProvider ?2.0+ ?setUserInfoProvider
用戶信息提供者 實現成功以后 在你的 會話界面 和 會話列表 頭像和昵稱 是會有正確展現的 實現代碼如下:
RongIM.setUserInfoProvider(this, false);
/**
* 用戶信息的提供者
*
* 融云會話界面 和 會話列表的 頭像 昵稱展示
*/
@Override
public UserInfo getUserInfo(String userId) {
//先從獲取數據庫操作的實例
FriendDao friendDao = DBManager.getInstance(MainActivity.this)
.getDaoSession().getFriendDao();
//獲取數據庫中我所有好友的bean對象
List friends = friendDao.loadAll();
if (friends != null && friends.size() > 0) {
//增強for把所有的用戶信息 return 給融云
for (Friend friend : friends) {
//判斷返回的userId
if (friend.getRongId().equals(userId)) {
return new UserInfo(friend.getRongId(), friend.getName(),
Uri.parse(friend.getPortraitUri()));
}
}
}
return null;
}
用戶信息提供者調用的實際建議在 init connect 之后 , 調用 會話列表 和 會話界面之前,筆者是在登錄的時候先把好友屬性
從自己的server 請求下來 塞到數據庫中做一個數據庫緩存 , 當然您自己可以有更好的方式 這邊僅作參考 設置以后
你可以觀察調用的時機 和 在 return 前輸出 每個對象 看看是否已經 return 給我們
refresh:
用戶信息的刷新我們這邊也提供了方法 請參見下面代碼 :
2.0+:
private void refreshUserInfo(UserInfo userInfo) {
if (userInfo == null||mRrongIMClient == null) {
throw new IllegalArgumentException();
}
if(RongContext.getInstance()!=null){
RongContext.getInstance().getUserInfoCache().put(userInfo.getUserId(),userInfo);
}
}
1.0+:
private void refreshUserInfo(UserInfo userInfo) {
if (userInfo == null||mRrongIMClient == null) {
throw new IllegalArgumentException();
}
if(RCloudContext.getInstance()!=null){
RCloudContext.getInstance().getUserInfoCache().put(userInfo.getUserId(),userInfo);
}
}
文章結束之前 提醒下 頭像的 路徑支持 http:// 或者 本地 sd 卡 file:/// 另
外不要使用內網 局域網路徑 您可以在瀏覽器看看是否能夠正常解析 來做檢測 非常感謝大家耐心看完
希望文章能夠對你有幫助
推薦github上一個好用的框架