更新时间: 2021-04-16

以下内容为快速集成摘要,具体细节可依次参考全局配置

# 导入 SDK

环境要求

名称 版本
Android SDK Build-tools 21 及以上
Android SDK Android API 19 及以上(安卓 4.4 )
JAVA JDK 1.7 及以上
Gradle 3.0 及以上版本

SDK 支持以下两种导入方式:

# Maven 方式

由于 Jcenter 于2021年 5 月 4 日 停止提供远程仓库服务,远程仓库统一由 JCenter 迁移到新的融云私有仓库。

不再支持该地址集成: https://dl.bintray.com/rongcloud/maven。

  1. 在工程根目录下的 build.gradle 配置脚本的 allprojects 中添加 SDK 的 Maven 仓库地址, 如下:
allprojects {
    repositories {
        jcenter()
        mavenCentral()
        maven {url  "http://maven.rongcloud.cn/repository/maven-releases/"}
    }
}
已复制
1
2
3
4
5
6
7
  1. 在项目主工程中的 build.gradle 添加远程依赖, 如下:
dependencies {
    api 'cn.rongcloud.sdk:im_kit:4.0.3.14'
    api 'cn.rongcloud.sdk:im_lib:4.0.3.14'
}
已复制
1
2
3
4
# Module 方式
  1. 下载 Module
  1. 导入 Module
  • 打开工程, File -> New -> Import Module. 找到下载的 Module 组件导入.
  • 在主工程的 build.gradle 文件中配置 Module, 如下:
dependencies {
    ...
    api project(':IMKit')
    api project(':IMLib')
    ...
}
已复制
1
2
3
4
5
6

查看 SDK 中 API 的方法

导入 javadoc 后可以轻松的在 Android Studio 中查看 API 的详细说明,如图:

导入方法请 点击查看 (opens new window)

# 初始化

融云 SDK 需要开发者在工程中调用下面方法来初始化 SDK。在 App 的整个生命周期中,开发者只需要将 SDK 初始化一次。

  1. Appkey 区分 开发环境生产环境,开发者在使用时注意当前环境是否匹配
  2. 建议在用户同意隐私协议后,再调用初始化
/**
 * 应用启动时,判断用户是否已接受隐私协议,如果已接受,正常初始化;否则跳转到隐私授权页面请求用户授权。
 */
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        //伪代码,从 sp 里读取用户是否已接受隐私协议
        boolean isPrivacyAccepted = getPrivacyStateFromSp();
        //用户已接受隐私协议,进行初始化
        if (isPrivacyAccepted) {
            String appKey = "融云开发者后台创建的应用的 AppKey";
            //第一个参数必须传应用上下文
            RongIM.init(this.getApplicationContext(), appKey);
        } else {
            //用户未接受隐私协议,跳转到隐私授权页面。
            goToPrivacyActivity();
        }
        ...
    }
}

/**
 * 该类为隐私授权页面,示范如何在用户接受隐私协议后进行 IM 初始化。
 */
public class PrivacyActivity extends Activity implements View.OnClickListener {
    ...
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.accept_privacy:
                //伪代码,保存到 sp
                savePrivacyStateToSp();

                String appKey = "融云开发者后台创建的应用的 AppKey";
                //第一个参数必须传应用上下文
                RongIM.init(this.getApplicationContext(), appKey);
                break;
            default:
                ...
        }
    }
}
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# 连接 IM

连接服务器之前需先获取用户 token 才可进行连接. 具体获取方法可参考 Server API 获取 Token

String token = "用户Token";
RongIM.connect(token, new RongIMClient.ConnectCallback() {
    @Override
    public void onDatabaseOpened(RongIMClient.DatabaseOpenStatus code) {
        //消息数据库打开,可以进入到主页面
    }

    @Override
    public void onSuccess(String s) {
        //连接成功
    }

    @Override
    public void onError(RongIMClient.ConnectionErrorCode errorCode) {
        if(errorCode.equals(RongIMClient.ConnectionErrorCode.RC_CONN_TOKEN_INCORRECT)) {
            //从 APP 服务获取新 token,并重连
        } else {
            //无法连接 IM 服务器,请根据相应的错误码作出对应处理
        }
    }
})
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 构建会话列表

  1. 创建会话 Activity (以 ConversationListActivity 为例) 以及 Activity 所对应的 xml 布局 (以 activity_conversation_list.xml 为例)

  2. activity_conversation_list.xml 布局中创建 View 容器用于动态添加 ConversationListFragment.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>
已复制
1
2
3
4
5
6
7
8
9
10
  1. ConversationListActivityonCreate 方法中创建并使用 ConversationListFragment.
class ConversationListActivity extends FragmentActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_conversation_list);

        ConversationListFragment conversationListFragment=new ConversationListFragment();
        // 此处设置 Uri. 通过 appendQueryParameter 去设置所要支持的会话类型. 例如
        // .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(),"false")
        // 表示支持单聊会话, false 表示不聚合显示, true 则为聚合显示
        Uri uri = Uri.parse("rong://" +
                getActivity().getApplicationInfo().packageName).buildUpon()
                .appendPath("conversationlist")
                .appendQueryParameter(Conversation.ConversationType.PRIVATE.getName(), "false") //设置私聊会话是否聚合显示
                .appendQueryParameter(Conversation.ConversationType.GROUP.getName(), "false")//群组
                .appendQueryParameter(Conversation.ConversationType.PUBLIC_SERVICE.getName(), "false")//公共服务号
                .appendQueryParameter(Conversation.ConversationType.APP_PUBLIC_SERVICE.getName(), "false")//订阅号
                .appendQueryParameter(Conversation.ConversationType.SYSTEM.getName(), "true")//系统
                .build();

        conversationListFragment.setUri(uri);
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.container, conversationListFragment);
        transaction.commit();

    }
}
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  1. AndroidManifest.xml 配置 Activity

SDK 内部通过隐式调用的方式来实现跳转到会话列表界面。需在 AndroidManifest.xml 中配置会话列表 ConversationListActivity 下面配置 intent-filter.

  1. 必须要给 Activity 配置 intent-filter. 否则使用 IMkit 中启动会话列表的方法将无效.
  2. android:host 的值需填写 App 的 ApplicationId.
<activity
    android:name="xxx.xxx.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="${applicationId}"
            android:pathPrefix="/conversationlist"
            android:scheme="rong" />
    </intent-filter>
</activity>

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14

启动会话列表

配置好会话列表后, 可在连接成功后启动会话界面.

supportedConversation 为设置要支持的会话类型.

  1. String 为要支持的会话类型的值, 可通过 ConversationType (opens new window)的 getValue() 方法获取;
  2. Boolean 为当前会话类型是否要支持聚合显示, true 为支持, false 为不支持
Map<String, Boolean> supportedConversation = new HashMap<>();
supportedConversation.put(ConversationType.PRIVATE.getValue(), false);
supportedConversation.put(ConversationType.GROUP.getValue(), false);
supportedConversation.put(ConversationType.SYSTEM.getValue(), true);
RongIM.getInstance().startConversationList(Context , supportedConversation);
已复制
1
2
3
4
5

# 构建会话页面

  1. 创建会话 Activity (以 ConversationActivity 为例) 以及 Activity 所对应的 xml 布局 (以 activity_conversation.xml 为例)

  2. activity_conversation.xml 布局中创建 View 容器用于动态添加 ConversationFragment.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
</LinearLayout>
已复制
1
2
3
4
5
6
7
8
9
10
  1. 在 ConversationActivity 的 onCreate 方法中创建并使用 ConversationFragment.
ConversationFragment conversationFragment=new ConversationFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, conversationFragment);
transaction.commit();
已复制
1
2
3
4
5
  1. AndroidManifest 配置 Activity

SDK 内部通过隐式调用的方式来实现跳转到会话列表界面。需在 AndroidManifest.xml 中配置会话列表 ConversationActivity 下面配置 intent-filter.

  1. Activity 必须配置 intent-filter, 否则将无法正常启动会话页面
  2. android:host 的值需填写 App 的 ApplicationId
<activity
    android:name="xxx.xxx.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="${applicationId}"
            android:pathPrefix="/conversation/"
            android:scheme="rong" />
    </intent-filter>
</activity>

已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 设置用户信息

开发者与融云服务器建立连接之后,应该设置用户信息,用于SDK显示和发送。可使用下面方式设置用户信息。可设置缓存用户信息. 当设置 true 后, 优先从缓存中获取用户信息. 更新用户信息, 需调用 RongIM.getInstance().refreshUserInfoCache(userInfo)|

# 同步设置

代码示例

// 是否缓存用户信息. true 缓存, false 不缓存
// 1. <span style="color:red">当设置 true 后, 优先从缓存中获取用户信息.  
// 2. 更新用户信息, 需调用 RongIM.getInstance().refreshUserInfoCache(userInfo)
boolean isCacheUserInfo = true;
RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {

    /**
     * 获取设置用户信息. 通过返回的 userId 来封装生产用户信息.
     * @param userId 用户 ID
     */
    @Override
    public UserInfo getUserInfo(String userId) {
        UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应的头像地址"))
        return userInfo;
    }

}, isCacheUserInfo);
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 异步设置
  1. getUserInfo 方法中返回 null.
// 是否缓存用户信息. true 缓存, false 不缓存
// 1. <span style="color:red">当设置 true 后, 优先从缓存中获取用户信息.  
// 2. 更新用户信息, 需调用 RongIM.getInstance().refreshUserInfoCache(userInfo)
boolean isCacheUserInfo = true;
RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {

    /**
     * 获取设置用户信息. 通过返回的 userId 来封装生产用户信息.
     * @param userId 用户 ID
     */
    @Override
    public UserInfo getUserInfo(String userId) {
        // 执行异步请求逻辑方法
        return null;
    }

}, isCacheUserInfo);
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  1. 调用刷新方法, 刷新用户信息缓存
UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应的头像地址"))
RongIM.getInstance().refreshUserInfoCache(userInfo);

已复制
1
2
3

文档是否解决您的问题 ?

如果遇到产品相关问题,您可 提交工单 寻求帮助