文档导航
Android
SDK 版本:  5.X
公告:融云新文档中心已上线,欢迎到新文档中心阅读 Android IMLibAndroid IMKit 的文档。

用户信息

更新时间:2024-02-06 PDF

用户信息

要在 IMKit UI 上展示用户头像、昵称等,需要应用层(App)主动向 IMKit SDK 提供用户信息UserInfo)。

IMKit 使用 RongUserInfoManager 类统一管理以下数据。App 需要使用 RongUserInfoManager 向 IMKit 提供数据,用于在 UI 上展示。

  • 用户信息:包含昵称、头像
  • 群组信息:包含群组名称、群组头像
  • 群成员用户信息:仅支持群用户昵称
提示

用户信息、群组信息、群成员用户信息必须由应用开发者主动从 App 服务端获取,并提供给 SDK。融云不提供 App 用户与群组信息托管服务。融云服务端的用户昵称及头像仅用于推送服务。

本文仅描述了应用层(App)如何为 IMKit SDK 提供用户昵称与头像(UserInfo):

UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应头像地址"));
              
已复制
1

刷新用户信息

如果 App 本地持有用户信息数据(例如当前登录用户的昵称和头像),可直接刷新本地缓存和数据库中存储的用户信息(头像与昵称)。刷新后,IMKit UI 会展示最新的用户信息 UserInfo

刷新用户信息必须在 IMKit 已成功建立 IM 连接后操作,否则无法刷新本地数据。可能适用场景如下:

  • App 首次启动,并成功建立 IM 连接以后,可以将自身业务所需的用户信息批量提供给 SDK,由 SDK 写入缓存与本地数据库,供后续使用。
  • 在 IM 建立连接后,如果用户昵称、头像等信息变动,由 App 服务端通知客户端(例如使用消息),客户端调用接口刷新用户信息。
UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应头像地址"));
RongUserInfoManager.getInstance().refreshUserInfoCache(userInfo);
              
已复制
1
2

如果 App 本地不持有数据,推荐在 IMKit 需要展示数据时动态提供用户信息。

动态提供用户信息

从 IMKit 5.X 版本开始,SDK 设计了「用户信息提供者」UserDataProvider.UserInfoProvider 接口类。如果 IMKit 无法从 RongUserInfoManager 中获取用户信息,将触发 UserInfoProvidergetUserInfo 回调方法。App 应在该回调中提供 SDK 所需要的用户头像与昵称。

获取用户信息数据后,SDK 会自动设置、刷新用户头像与昵称,以及实现相关 UI 展示。

public interface UserInfoProvider {
  /**
         * 获取用户信息。
         *
         * @param userId 用户 Id。
         * @return 用户信息。
         */
  UserInfo getUserInfo(String userId);
}
              
已复制
1
2
3
4
5
6
7
8
9

步骤 1:设置用户信息提供者

使用 RongUserInfoManagersetUserInfoProvider 方法设置用户信息提供者。必须在 SDK 初始化之后,建立 IM 连接之前设置。建议在应用生命周期内设置。

// 允许 SDK 在本地持久化存储用户信息
boolean isCacheUserInfo = true;

RongUserInfoManager.getInstance().setUserInfoProvider(new UserDataProvider.UserInfoProvider() {
    @Override
    public UserInfo getUserInfo(String userId) {
    ...// 此处需要 App 提供用户信息。
    }
}, isCacheUserInfo);
              
已复制
1
2
3
4
5
6
7
8
9

参数 类型 说明
userInfoProvider UserDataProvider.UserInfoProvider 用户信息提供者接口
isCacheUserInfo boolean 是否持久化存储用户信息到 SDK 的本地数据库。true 表示存储。false 表示不存储。
提示

建议设置 isCacheUserInfotrue,即在本地持久化存储用户信息。

在 App 的生命周期中,如果 SDK 获取过用户的信息,便会在内存中缓存该信息。允许持久化存储后,SDK 优先从本地数据库中获取用户信息,App 下次启动时数据仍然可用。SDK 在处理对应信息时默认行为如下:

  1. 当 SDK 需要在 UI 上显示用户信息时,首先从内存中查询已获取的数据。
  2. 如果 SDK 可从缓存或本地数据库中查询到所需信息,将直接将数据返回 UI 层并刷新 UI。
  3. 如果 SDK 未能从缓存或本地数据库查询到所需信息,则将触发 UserDataProvider.UserInfoProvider 的回调方法,并尝试从应用层获取信息。收到应用层提供的相应信息后,SDK 将刷新 UI。

步骤 2:提供用户信息给 SDK

在需要展示用户信息时(例如会话列表页面、会话页面),IMKit 首先会根据用户 ID 逐个调用 RongUserInfoManagergetUserInfo 方法获取用户信息。如果 SDK 无法在缓存或本地数据库中查询到所需用户信息,则会触发 UserDataProvider.UserInfoProvider 的回调方法,要求 App 提供用户信息数据。

请在 UserDataProvider.UserInfoProvidergetUserInfo 回调触发时,向 SDK 提供用户信息数据。

  • 异步获取用户信息,再手动刷新: App 可以使用该方式避免耗时操作影响 UI。

    1. App 需要在 getUserInfo 方法中直接返回 null,同时,App 应在该方法中触发自行获取 userId 的用户信息的逻辑。注意,该步骤会将 userId 的用户信息临时置为空。

      RongUserInfoManager.getInstance().setUserInfoProvider(new UserDataProvider.UserInfoProvider {
          @Override
          public UserInfo getUserInfo(String userId) {
              ...// 在需要展示用户信息时(例如会话列表页面、会话页面),IMKit 首先会根据用户 ID 逐个调用 getUserInfo。
              // 此处由 App 自行完成异步请求用户信息的逻辑。后续通过 refreshUserInfoCache 提供给 SDK。
              return null;
          }
      
      }, true);
                    
      已复制
      1
      2
      3
      4
      5
      6
      7
      8
      9

    2. App 成功获取 userId 的用户信息数据后,再调用 RongUserInfoManagerrefreshUserInfoCache 方法,手动刷新 userId 用户信息。SDK 在收到该用户的信息后会刷新 UI。详见刷新用户信息

      UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应的头像地址"))
      RongUserInfoManager.getInstance().refreshUserInfoCache(userInfo);
                    
      已复制
      1
      2

  • 同步返回用户信息:App 也可以直接返回 userId 的用户信息。SDK 在收到该用户的信息后会刷新 UI。

    RongUserInfoManager.getInstance().setUserInfoProvider(new UserDataProvider.UserInfoProvider() {
        @Override
        public UserInfo getUserInfo(String userId) {
            UserInfo userInfo = new UserInfo(userId, "userId 对应的名称", Uri.parse("userId 对应的头像地址"))
            return userInfo;
        }
    }, true);
                  
    已复制
    1
    2
    3
    4
    5
    6
    7

获取用户信息

App 可以主动调用 RongUserInfoManagergetUserInfo 方法获取用户信息。SDK 的行为如下:

  1. 首先尝试从本地缓存获取应用层提供的数据。如果在设置用户信息提供者时,已授权 SDK 在本地数据库中存储用户信息(即 isCacheUserInfotrue),SDK 还会尝试从本地数据库中获取用户信息。
  2. 如果本地没有相关信息的数据,SDK 会触发 UserInfoProvidergetUserInfo 回调方法。如果您的 App 应用层已在该回调中提供数据,则 SDK 可成功获取用户信息 UserInfo
String userId = "用户 Id"
UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(userId)
              
已复制
1
2

输入参数 类型 说明
userId String 用户 ID
文档反馈
意见反馈

您的改进建议

意见反馈

问题类型

联系我们

提交工单

技术支持|集成使用|产品方案


商务咨询

7 x 24 小时

为您解答方案与报价问题

131 6185 6839

文档反馈