Android 融云IM集成以及使用详解(一)

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.融云结构(各项目结构不同请自行参考)

结构图

Activity结果图

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

下篇将讲解单聊聊天界面以及群里聊天界面的使用以及坑…

猜你喜欢

转载自blog.csdn.net/qq_38605423/article/details/84928692