2018 融云集成

接入融云

融云SDK满足 App 内的社交沟通需求,提供单群聊、超级群等多种聊天模式,支持红包、图片、语音和小视频,实时消息推送,高度自定义界面,高清音视频通话,有效提升用户粘性和活跃度,所以我用融云。

添加应用

要接入第三方 SDK 都要在其开发者平台注册账号,添加应用,审核获取 appkey secretkey。这样子的流程。然后去看他的 SDK 接入指南。

开始

下载融云 SDK,看你功能需要选择下载。
http://www.rongcloud.cn/downloads

新建项目,引入融云远程库,加入第三方库

    implementation 'cn.rongcloud.android:IMKit:2.8.6'
    implementation 'cn.rongcloud.android:IMLib:2.8.6'

把 下载好的 SDK 中 libs 里面的文件加入到项目lib里面(armeabi里面的libpush.so
以及libsqlite.so)

新建src/main/assets/ 并加入 SDK 里面的 armeabi/push_deamon

Androidmanifest.xml
加入权限

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 获取机型信息权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />

    <!-- 查看 Wi-Fi 状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 查看网络状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <!-- 录音 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 控制振动器 -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <!-- 防止设备休眠 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
    <!-- 获取联系人信息,demo 中演示发送通讯录消息 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <!-- ⼩米 配置开始 < -->
    <permission
        android:name="cn.rongcloud.im.permission.MIPUSH_RECEIVE"
        android:protectionLevel="signature" />
    <uses-permission android:name="cn.rongcloud.im.permission.MIPUSH_RECEIVE" />
    <!-- ⼩米 配置结束 < -->
    <!-- GCM 配置开始 < -->
    <permission
        android:name="cn.rongcloud.im.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="cn.rongcloud.im.permission.C2D_MESSAGE" />
    <!-- GCM 配置结束 < -->
    <!-- 华为 配置开始 < -->
    <!--HMS-SDK 引导升级 HMS 功能,访问 OTA 服务器需要网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--HMS-SDK 引导升级 HMS 功能,保存下载的升级包需要 SD 卡写权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 检测网络状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 检测 wifi 状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 为了获取用户手机的 IMEI,用来唯一的标识用户。-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <!-- 如果是安卓 8.0,应用编译配置的 targetSdkVersion>=26,请务必添加以下权限 -->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <!-- 华为 配置结束 < -->

    <!-- MeiZu 配置开始 < -->
    <!-- 兼容 flyme5.0 以下版本,魅族内部集成 pushSDK 必填,不然无法收到 消息 -->
    <uses-permission
        android:name="com.meizu.flyme.push.permission.RECEIVE"/>
    <permission
        android:name="cn.rongcloud.im.push.permission.MESSAGE"
        android:protectionLevel="signature"/>
    <uses-permission android:name="cn.rongcloud.im.push.permission.MESSAGE"/>
    <!-- 兼容 flyme3.0 配置权限 -->
    <uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
    <!-- MeiZu 配置结束 < -->
    

新建 Application 在 oncreate 初始化 sdk
因为接入了融云 SDK会有主进程,和推送进程,那我们在主进程进行初始化

    if (applicationInfo.packageName == getCurProcessName(applicationContext)) {
        try {
            RongIM.init(this,Constant.APP_KEY)
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
        }
        }

然后调用 RongIM.connect,在成功的回调进行内容提供者(设置头像和昵称),token要在后台获取,测试的时候你可以在 应用里面获取 token

   RongIM.connect(token, object : RongIMClient.ConnectCallback() {
                override fun onTokenIncorrect() {
                    //get token again
                }
                override fun onSuccess(userid: String) {
                    progress.visibility = View.GONE
                    connectBtn.text = "欢迎回来$name$userId"
                    RongIM.getInstance().setCurrentUserInfo(UserInfo(userId,name, Uri.parse(image)))
                    RongIM.getInstance().setMessageAttachedUserInfo(true)
                    //用户内容提供者(userid+username+image)
                }
                override fun onError(errorCode: RongIMClient.ErrorCode) {
                    //Ooooop
                }
            }

创建会话列表

�创建ConversationListActivity ,在布局文件加入

  <fragment
        android:id="@+id/conversationlist"
        android:name="io.rong.imkit.fragment.ConversationListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

再注册这个activity,因为是隐式跳转这个 activity 注意 data 的 host 是写自己包名

<activity android:name="com.ppjun.android.improject.mvp.ui.ConversationListActivity"
            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="com.ppjun.android.improject"
                    android:pathPrefix="/conversationlist"
                    android:scheme="rong" />
            </intent-filter>
        </activity>

创建聚合会话列表

创建 SubConversationListActivity ,在其布局文件加入

    <fragment
        android:id="@+id/subconversationlist"
        android:name="io.rong.imkit.fragment.SubConversationListFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

再注册这个activity,因为是隐式跳转这个 activity 注意 data 的 host 是写自己包名

  <!--聚合会话列表-->
        <activity
            android:name="com.ppjun.android.improject.mvp.ui.SubConversationListActivity"
            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="com.ppjun.android.improject"
                    android:pathPrefix="/subconversationlist"
                    android:scheme="rong" />
            </intent-filter>
        </activity>

创建会话

创建 ConversationActivity ,在其布局文件加入

  <fragment
        android:id="@+id/conversation"
        android:name="io.rong.imkit.fragment.ConversationFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

再注册这个activity,因为是隐式跳转这个 activity 注意 data 的 host 是写自己包名

   <!--会话界面-->
        <activity
            android:name="com.ppjun.android.improject.mvp.ui.ConversationActivity"
            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="com.ppjun.android.improject"
                    android:pathPrefix="/conversation/"
                    android:scheme="rong" />
            </intent-filter>
        </activity>

打开会话列表

  private fun startConversationList() {
        val map = HashMap<String, Boolean>()
        map.put(Conversation.ConversationType.PRIVATE.getName(), false) // 会话列表需要显示私聊会话, 第二个参数 true 代表私聊会话需要聚合显示
        map.put(Conversation.ConversationType.GROUP.getName(), false)  // 会话列表需要显示群组会话, 第二个参数 false 代表群组会话不需要聚合显示
        RongIM.getInstance().startConversationList(this@MainActivity, map)
    }

创建私聊会话

     RongIM.getInstance().startPrivateChat(this@MainActivity, "123456", "userid")

项目地址 https://github.com/gdmec07120731/IMProject

常见问题

connect 无回调,报找不到 libsqlite.so 异常
解决方法 http://support.rongcloud.cn/kb/NTQw

点赞