Android及時通訊之--------融云篇
想一想,世界可能會更好。 ---來自未來的詩人杜鵬鵬
前些天項目中接入了融云及時通訊,閑了無事,做一個小小的總結。
使用 Android Studio 集成融云,基本可以分為一下幾個步驟:
1.進入融云官網Android 下載頁面(附網址:http://www.rongcloud.cn/downloads),分為兩種,IMKit SDK和IMLib SDK。IMLib庫是屬于自己定制需求的,IMKit基本就滿足一般項目的需求了,所以我這里用的是IMKit SDK,有興趣的同學可以研究一下另一個.
2.將 IMKitsdk 作為 Module 導入到 Project 中,在 application 中調用RongIM.init(this);
3.在 activity 中連接融云,RongIM.connect(token,callback)操作。當然這個操作的前提是你已經從公司后臺服務器中獲取到了Token。因為考慮到登錄融云操作可能在其他地方:斷網后再來連接/被擠下線等。所以我把這個操作單另寫了一個類,具體聯(lián)網方法:
* **/*建立與融云服務器的連接*/** *public voidconnect() {* *if(context.getApplicationInfo().packageName.equals(BTCollegeApp.getCurProcessName(BTCollegeApp.getAppContext()))) {* */* IMKit SDK調用第二步,建立與服務器的連接*/* *RongIM.connect(token, newRongIMClient.ConnectCallback() {* */*Token錯誤,在線上環(huán)境下主要是因為Token已經過期,您需要向App Server重新請求一個新的Token*/* *@Override* *public voidonTokenIncorrect() {* *Log.e("LoginActivity錯誤","--onTokenIncorrect");* *}* */*** **連接融云成功* **@paramuserid當前token* **/* *@Override* *public voidonSuccess(String userid) {* *Log.e("LoginActivity成功","--onSuccess"+ userid);* *userID= userid;* *rongCloudInit();* *}* */*** **連接融云失敗* **@paramerrorCode錯誤碼,可到官網 查看錯誤碼對應的注釋* **/* *@Override* *public voidonError(RongIMClient.ErrorCode errorCode) {* *Log.d("LoginActivity失敗","--onError"+ errorCode);* *}* *});* *}* *}* *
4.這里我們分開關注兩個點:會話列表和會話界面
1>.會話界面
新建ConversationActivity類,然后在其布局文件中寫自己的定制界面(一般是標題欄),對話界面融云已經幫我們寫好了,只需要將這段代碼復制即可:
<fragment
android:id="@+id/chat_window_fragment"
android:layout_below="@+id/conversation_topbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="io.rong.imkit.fragment.ConversationFragment"/>
設置標題:
Uri uri= getIntent().getData();
userID= uri.getQueryParameter("targetId").toString();
title= uri.getQueryParameter("title").toString();
2>.會話列表
會話列表分為兩種情況:會話列表在activity中,會話類別在fragment中。如果會話列表在activity中,屬于常規(guī)情況,查閱官方文檔即可。下面具體說一下第二種情況:
首先在會話列表所在的fragment類的布局文件中添加以下代碼:
android:id="@+id/rong_content"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
然后在此fragment類中添加以下代碼
ConversationListFragmentfragment =newConversationListFragment();
Uri uri = Uri.parse("rong://"+ getActivity().getApplicationInfo().packageName).buildUpon()
.appendPath("conversationlist")
.appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(),"false")//設置私聊會話非聚合顯示
.appendQueryParameter(Conversation.ConversationType.GROUP.getName(),"true")//設置群組會話聚合顯示
.appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(),"false")//設置討論組會話非聚合顯示
.appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(),"false")//設置系統(tǒng)會話非聚合顯示
.build();
fragment.setUri(uri);
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.add(R.id.rong_content,fragment);
transaction.commit();
這樣會話列表和會話界面就基本實現(xiàn)了,但是問題又來了。。。。
用戶想用自己的頭像和昵稱而不是融云自帶的固定的。還有就是很多聊天軟件點擊對方頭像時可以跳到對方資料界面
1.點擊:
RongIM.setConversationBehaviorListener(newRongIM.ConversationBehaviorListener() {
@Override//頭像
public booleanonUserPortraitClick(Context context,Conversation.ConversationType conversationType,UserInfo userInfo) {
return true;
}
@Override
public booleanonUserPortraitLongClick(Context context,Conversation.ConversationType conversationType,UserInfo userInfo) {
return false;
}
@Override//消息
public booleanonMessageClick(Context context,View view,Message message) {
return false;
}
@Override
public booleanonMessageLinkClick(Context context,String s) {
return false;
}
@Override
public booleanonMessageLongClick(Context context,View view,Message message) {
return false;
}
});
2.設置用戶信息:
RongIM.setUserInfoProvider(newRongIM.UserInfoProvider() {
@Override
publicUserInfogetUserInfo(finalString userId) {
UserInfo userInfo=newUserInfo(userId,用戶名,Uri.parse(頭像的url地址));
return userInfo;
}
}, true);
當然這里可能又會出現(xiàn)問題,融云只返回了用戶userid,如果想要設置用戶信息,可能還要根據userid聯(lián)網查詢信息,但是聯(lián)網需要耗時,導致上面return userinfo的時候回為空,解決辦法就是:
先不管此代碼,在聯(lián)網獲取到用戶數據后寫如下代碼即可:
RongIM.getInstance().refreshUserInfoCache(newUserInfo(userid,UserName,Uri.parse(messageUserImage)));
到此結束,謝謝閱讀