Android 融雲IM集成以及使用詳解(一)
集成
1.具體的集成步驟就不在詳細介紹,我們只說乾貨,附上融雲IM官方文檔地址,裏面有更爲詳細的集成介紹
https://www.rongcloud.cn/docs/#necessary
集成後效果
2.AndroidManifest配置融雲需要的配置
<!-- 融雲相關 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="自己的包名.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/rc_file_path"/>
</provider>
<!-- 單人會話界面 -->
<activity
android:name=".im.activity.ChatActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="替換成自己的包名"
android:pathPrefix="/conversation/"
android:scheme="rong" />
</intent-filter>
</activity>
<!-- 聚合會話列表 -->
<activity
android:name=".im.activity.SubConversationListActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="替換成自己的包名"
android:path="/subconversationlist"
android:scheme="rong" />
</intent-filter>
</activity>
<!-- 融雲消息監聽 -->
<!-- <receiver android:name=".receiver.SealNotificationReceiver"/> -->
<receiver
android:name=".receiver.SealNotificationReceiver"
android:exported="true">
<intent-filter>
<action android:name="io.rong.push.intent.MESSAGE_ARRIVED" />
<action android:name="io.rong.push.intent.MI_MESSAGE_ARRIVED" />
<action android:name="io.rong.push.intent.MESSAGE_CLICKED" />
<action android:name="io.rong.push.intent.MI_MESSAGE_CLICKED" />
<action android:name="io.rong.push.intent.THIRD_PARTY_PUSH_STATE" />
</intent-filter>
</receiver>
3.融雲結構(各項目結構不同請自行參考)
4.融雲需要進行的配置
- 需要**在BaseApplication進行的配置
//初始化融雲
RongIM.init(this);
//初始化聊天界面底部的自定義按鈕 具體在下面會詳細介紹
RongExtensionManager.getInstance().registerExtensionModule(RecognizeExtensionModule2.getInstence());
//設置融雲的消息記錄的暱稱和頭像的內容提供者
RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {
@Override
public UserInfo getUserInfo(String userId) {
LogUtils.e("我執行了》》》》》》"+userId);//提供的是融雲的ID
UserInfo userInfo = new UserInfo(userId, "", null);
//在這裏通過融雲ID向自己的後臺請求用戶數據
return userInfo;
}
}, true);
//羣聊的用戶數據提供者 同上
RongIM.setGroupUserInfoProvider(new RongIM.GroupUserInfoProvider() {
@Override
public GroupUserInfo getGroupUserInfo(String s, String s1) {
//設置數據
RongIM.getInstance().refreshGroupInfoCache(new Group(groupid, nickName, Uri.parse(avatar)));
return getGroupUserInfos(s, s1); //向自己後臺獲取
}
}, true);
//融雲的配置
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.de_default_portrait)
.showImageOnFail(R.drawable.de_default_portrait)
.showImageOnLoading(R.drawable.de_default_portrait)
.displayer(new FadeInBitmapDisplayer(300))
.cacheInMemory(true)
.cacheOnDisk(true)
.build();
2.使用步驟
- 在自己的登錄界面 調用自己的登錄接口後調用融雲的連接接口
//Token是自己後臺返回
private void connect(String rongCloudToken, String nickName, String phono) {
if (getApplicationInfo().packageName.equals(getCurProcessName(getApplicationContext()))) {
RongIM.connect(rongCloudToken, new RongIMClient.ConnectCallback() {
/**
* Token 錯誤。可以從下面兩點檢查
* 1. Token 是否過期,如果過期您需要向 App Server 重新請求一個新的 Token
* 2. token 對應的 appKey 和工程裏設置的 appKey 是否一致
*/
@Override
public void onTokenIncorrect() {
ToastView("--------------------Token相關問題");
}
/**
* 連接融雲成功
* @param userid 當前 token 對應的用戶 id
*/
@Override
public void onSuccess(String userid) {
LoadingView.dismissLoading(mShowLoading);
Log.e("tag", "--------------------融雲登錄成功>>>用戶id: " + userid);
Intent intent = new Intent(LoginActivity.this, HomeActivity.class);
intent.putExtra("noticeBean", gson.toJson(noticeBean));
startActivity(intent);
//設置自己的用戶信息
RongIM.getInstance().refreshUserInfoCache(new UserInfo(userid, nickName, Uri.parse(phono)));
finish();
}
/**
* 連接融雲失敗
* @param errorCode 錯誤碼,可到官網 查看錯誤碼對應的註釋
*/
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
ToastView("--------------------登錄失敗" + errorCode);
}
});
}
}
2.消息界面
- 分爲消息記錄和好友界面 先附上兩張圖方便下面解釋
額…表示不全(拼音分類的還有列表哈)
- 效果看了下面講講具體的實現步驟(主界面就不用詳細介紹了 ViewPage + Fragment)
private void initFragment() {
mFragments = new ArrayList<>();
Fragment conversationFragment = new MessageFragment();
FriendFragment friendFragment = new FriendFragment();
mFragments.add(conversationFragment);
mFragments.add(friendFragment);
}
先看看消息記錄的Fragment怎麼實現的
XML文件:
<FrameLayout
android:id="@+id/mConversation"
android:layout_width="match_parent"
android:layout_height="wrap_content"></FrameLayout>
//重要代碼
if(fragment != null){
transaction.remove(fragment);
}
//初始化融雲自己的界面
fragment = initConversationList();
//添加到佈局
transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mConversation, fragment);
transaction.commit();
/**
* 初始化會話列表
*
* @return
*/
private Fragment initConversationList() {
if (mConversationListFragment == null) {
ConversationListFragment listFragment = new ConversationListFragment();
listFragment.setAdapter(new ConversationListAdapterEx(RongContext.getInstance()));
Uri uri;
if (isDebug) {
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.PUBLIC_SERVICE.getName(), "false")//公共服務號
.appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")//訂閱號
.appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")//系統
.appendQueryParameter(Conversation.ConversationType.DISCUSSION.getName(), "true")
.build();
mConversationsTypes = new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE,
Conversation.ConversationType.GROUP,
Conversation.ConversationType.PUBLIC_SERVICE,
Conversation.ConversationType.APP_PUBLIC_SERVICE,
Conversation.ConversationType.SYSTEM,
Conversation.ConversationType.DISCUSSION
};
} else {
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.PUBLIC_SERVICE.getName(), "false")//公共服務號
.appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")//訂閱號
.appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")//系統
.build();
mConversationsTypes = new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE,
Conversation.ConversationType.GROUP,
Conversation.ConversationType.PUBLIC_SERVICE,
Conversation.ConversationType.APP_PUBLIC_SERVICE,
Conversation.ConversationType.SYSTEM
};
}
listFragment.setUri(uri);
mConversationListFragment = listFragment;
return listFragment;
} else {
return mConversationListFragment;
}
}
- 好友列表的Fragment參考Dome中就OK 裏面的代碼可以直接Copy過來稍加修改就行,附上一張圖片
- 最後附上融雲提供的Dome地址,裏面很多東西 可以自行去研究
https://github.com/sealtalk/sealtalk-android
下篇將講解單聊聊天界面以及羣裏聊天界面的使用以及坑…