Android及時通訊之--------融云篇
想一想,世界可能會更好摔敛。 ---來自未來的詩人杜鵬鵬
前些天項目中接入了融云及時通訊辞槐,閑了無事掷漱,做一個小小的總結(jié)。
使用 Android Studio 集成融云榄檬,基本可以分為一下幾個步驟:
1.進入融云官網(wǎng)Android 下載頁面(附網(wǎng)址:http://www.rongcloud.cn/downloads)卜范,分為兩種,IMKit SDK和IMLib SDK鹿榜。IMLib庫是屬于自己定制需求的海雪,IMKit基本就滿足一般項目的需求了,所以我這里用的是IMKit SDK,有興趣的同學(xué)可以研究一下另一個.
2.將 IMKitsdk 作為 Module 導(dǎo)入到 Project 中,在 application 中調(diào)用RongIM.init(this);
3.在 activity 中連接融云舱殿,RongIM.connect(token,callback)操作奥裸。當然這個操作的前提是你已經(jīng)從公司后臺服務(wù)器中獲取到了Token。因為考慮到登錄融云操作可能在其他地方:斷網(wǎng)后再來連接/被擠下線等沪袭。所以我把這個操作單另寫了一個類湾宙,具體聯(lián)網(wǎng)方法:
* **/*建立與融云服務(wù)器的連接*/** *public voidconnect() {* *if(context.getApplicationInfo().packageName.equals(BTCollegeApp.getCurProcessName(BTCollegeApp.getAppContext()))) {* */* IMKit SDK調(diào)用第二步,建立與服務(wù)器的連接*/* *RongIM.connect(token, newRongIMClient.ConnectCallback() {* */*Token錯誤,在線上環(huán)境下主要是因為Token已經(jīng)過期,您需要向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錯誤碼侠鳄,可到官網(wǎng) 查看錯誤碼對應(yīng)的注釋* **/* *@Override* *public voidonError(RongIMClient.ErrorCode errorCode) {* *Log.d("LoginActivity失敗","--onError"+ errorCode);* *}* *});* *}* *}* *
4.這里我們分開關(guān)注兩個點:會話列表和會話界面
1>.會話界面
新建ConversationActivity類埠啃,然后在其布局文件中寫自己的定制界面(一般是標題欄),對話界面融云已經(jīng)幫我們寫好了伟恶,只需要將這段代碼復(fù)制即可:
<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"/>
設(shè)置標題:
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")//設(shè)置私聊會話非聚合顯示
.appendQueryParameter(Conversation.ConversationType.GROUP.getName(),"true")//設(shè)置群組會話聚合顯示
.appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(),"false")//設(shè)置討論組會話非聚合顯示
.appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(),"false")//設(shè)置系統(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.設(shè)置用戶信息:
RongIM.setUserInfoProvider(newRongIM.UserInfoProvider() {
@Override
publicUserInfogetUserInfo(finalString userId) {
UserInfo userInfo=newUserInfo(userId,用戶名,Uri.parse(頭像的url地址));
return userInfo;
}
}, true);
當然這里可能又會出現(xiàn)問題蒿叠,融云只返回了用戶userid明垢,如果想要設(shè)置用戶信息,可能還要根據(jù)userid聯(lián)網(wǎng)查詢信息市咽,但是聯(lián)網(wǎng)需要耗時痊银,導(dǎo)致上面return userinfo的時候回為空,解決辦法就是:
先不管此代碼,在聯(lián)網(wǎng)獲取到用戶數(shù)據(jù)后寫如下代碼即可:
RongIM.getInstance().refreshUserInfoCache(newUserInfo(userid,UserName,Uri.parse(messageUserImage)));
到此結(jié)束施绎,謝謝閱讀