跳到主要内容

用户信息托管

本文档旨在指导开发者如何在融云即时通讯 Android 客户端 SDK 中实现用户信息订阅、查询和监听,同时支持用户信息与权限的修改、查询。 通过本文档, Android 开发者将了解如何获取和跟踪用户信息,以及如何在用户信息变更、订阅状态变更时接收通知。

注意 此功能在 5.10.0 版本开始支持。

开通服务

使用此功能前,您须在控制台开通信息托管服务。

用户信息管理

可以修改或查询自已的用户信息,批量查询指定多个用户的用户信息。

用户信息设置

用户在应用中使用 updateMyUserProfile 可以修改自已的用户信息。

下表描述 UserProfile 类的属性,也可参考 API 文档。

属性名类型描述
nameString昵称,长度不超过 32 个字符。
portraitUriString头像地址,长度不超过 128 个字符。
uniqueIdString用户应用号,支持大小写字母、数字,长度不超过 32 个字符。请注意 SDK不支持设置此字段。
emailStringEmail,长度不超过 128 个字符。
birthdayString生日,长度不超过 32 个字符
genderint性别,未知 0 、男 1、女 2。
locationString所在地,长度不超过 32 个字符。
roleint角色,支持 0~100 以内数字。
levelint级别,支持 0~100 以内数字。
userExtProfilelong自定义扩展信息,默认最多可以设置 20 个用户信息(以 Key、Value 方式设置,扩展用户信息通过开发者后台进行设置)
  1. Key:支持大小写字母、数字,长度不超过 32 个字符,需要保障 AppKey 下唯一。Key 不存在时,设置不成功返回错识提示。
  2. Value:字符串,不超过 256 个字符。
// 更新自己的用户信息
UserProfile userProfile = new UserProfile();
RongCoreClient.getInstance().updateMyUserProfile(userProfile, new IRongCoreCallback.UpdateUserProfileCallback() {
@Override
public void onSuccess() {
// 更新成功
}

@Override
public void onError(int errorCode, String errorKey) {
// 更新失败
}
});

批量获取用户信息

您可以使用 getUserProfiles 方法查询指定用户的用户信息。一次最多查询20个用户的用户信息。

// 设置查询用户ID列表
List<String> userIdList = new ArrayList<>();
userIdList.add("user1");
userIdList.add("user2");
userIdList.add("user3");
RongCoreClient.getInstance().getUserProfiles(userIdList, new IRongCoreCallback.ResultCallback<List<UserProfile>>() {
@Override
public void onSuccess(List<UserProfile> userProfiles) {
// 查询成功,返回查询用户信息。
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// 查询失败
}
});

获取当前用户信息

您可以使用 getMyUserProfile 方法获取当前用户信息。

RongCoreClient.getInstance().getMyUserProfile(new IRongCoreCallback.ResultCallback<UserProfile>() {
@Override
public void onSuccess(UserProfile userProfile) {
// 查询成功,返回自己的用户信息。
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// 查询失败
}
});

用户权限

客户端 SDK 提供了用户权限的设置和获取接口,通过 UserProfileVisibility 枚举来表示用户权限,各枚举值代表的含义参考下表:

枚举值用户权限
UserProfileVisibility.NotSet未设置:以 AppKey 权限设置为准,默认是此状态。
UserProfileVisibility.Invisible都不可见:任何人都不能搜索到我的用户信息,名称、头像除外。
UserProfileVisibility.Everyone所有人:应用中任何用户都可以查看到我的用户信息。

用户权限设置

如果您需要设置用户权限,可以使用 updateMyUserProfileVisibility 方法。

// 用户信息权限
UserProfileVisibility visibility = UserProfileVisibility.Everyone;
RongCoreClient.getInstance().updateMyUserProfileVisibility(visibility, new IRongCoreCallback.ResultCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
// 设置成功
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// 设置失败
}
});

用户权限获取

如果您需要获取用户权限,可以使用 getMyUserProfileVisibility 方法。

// 获取自己的用户权限
RongCoreClient.getInstance().getMyUserProfileVisibility(new IRongCoreCallback.ResultCallback<UserProfileVisibility>() {
@Override
public void onSuccess(UserProfileVisibility userProfileVisibility) {
// 获取成功
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// 获取失败
}
});

用户权限说明

AppKey 默认用户信息权限为 都不可见,用户级别默认为 未设置,此状态默认可以查看用户名称和头像。 下面列举了 AppKey 级权限与 用户 级权限综合说明:

AppKey 权限用户级权限结果
都不可见、仅好友可见、所有人可见未设置以 AppKey 权限设置为准
都不可见、仅好友可见、所有人可见设置为(都不可见、所有人可见)以用户权限设置为准

用户搜索

按用户应用号精确搜索

支持按用户应用号搜索用户信息,可以使用 searchUserProfileByUniqueId 方法。

// 使用应用号查询用户信息
String uniqueId = "uniqueId";
RongCoreClient.getInstance().searchUserProfileByUniqueId(uniqueId, new IRongCoreCallback.ResultCallback<UserProfile>() {
@Override
public void onSuccess(UserProfile userProfile) {
// 查询成功
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
// 查询失败
}
});

用户信息&权限变更订阅

订阅用户信息&权限变更

为了跟踪特定用户的用户信息, 您需要使用 subscribeEvent 方法进行订阅。以下是具体的操作步骤和示例代码:

  1. 定义订阅用户 ID 列表: 创建一个包含您希望订阅用户 ID 的 ArrayList,即单聊的 targetId。一次订阅用户的上限为 200 个, 订阅的用户数最多为 1000 个,一个用户最多可以被 5000 个用户订阅。
  2. 设置订阅时间:定义一个整数值,该值表示订阅的持续时间,订阅时长的范围为 60 秒到 2592000 秒。
  3. 指定订阅类型: 使用 SubscribeEvent.SubscribeType.USER_PROFILE 来指定订阅的是用户信息。
  4. 使用 subscribeEvent 方法执行订阅操作。

示例代码

//设置订阅类型。
SubscribeEvent.SubscribeType type= SubscribeEvent.SubscribeType.USER_PROFILE;
//设置订阅时间,取值范围为[60,2592000](单位:秒)。
int expiry=180000;
//订阅用户userId,即单聊的 targetId (一次最多订阅 200 个)。
List<String> userList=new ArrayList<>();
userList.add("user1");
userList.add("user2");
userList.add("user3");
SubscribeEventRequest request = new SubscribeEventRequest(type,expiry,userList);
RongCoreClient.getInstance().subscribeEvent(request, new IRongCoreCallback.SubscribeEventCallback<List<String>>() {
@Override
public void onSuccess() {
//订阅成功。
}

@Override
public void onError(int errorCode, List<String> strings) {
//订阅失败。
}
});

取消用户信息&权限订阅

当您不再需要跟踪用户的用户信息时,可以使用 unSubscribeEvent 方法取消订阅。

//设置取消订阅的类型。
SubscribeEvent.SubscribeType type= SubscribeEvent.SubscribeType.USER_PROFILE;
//取消订阅用户userId,即单聊的 targetId,一次最多取消订阅 200 个。
List<String> userList=new ArrayList<>();
userList.add("user1");
userList.add("user2");
userList.add("user3");
SubscribeEventRequest request = new SubscribeEventRequest(type,userList);
RongCoreClient.getInstance().unSubscribeEvent(request, new IRongCoreCallback.SubscribeEventCallback<List<String>>() {
@Override
public void onSuccess() {
//取消订阅成功。
}

@Override
public void onError(int errorCode, List<String> strings) {
//取消订阅失败。
}
});

指定用户查询用户信息托管的订阅状态信息

您可以使用 querySubscribeEvent 方法查询指定用户和订阅类型的状态信息。一次最多查询200个用户的订阅状态信息。

//设置查询类型。
SubscribeEvent.SubscribeType type= SubscribeEvent.SubscribeType.USER_PROFILE;
//查询用户在线状态。
List<String> userList=new ArrayList<>();
userList.add("user1");
userList.add("user2");
userList.add("user3");
SubscribeEventRequest request = new SubscribeEventRequest(type,userList);
RongCoreClient.getInstance().querySubscribeEvent(request, new IRongCoreCallback.ResultCallback<List<SubscribeInfoEvent>>() {
@Override
public void onSuccess(List<SubscribeInfoEvent> subscribeInfoEvents) {
//查询成功,返回查询用户信息。
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
//查询失败。
}
});

分页查询已订阅用户信息托管的用户的状态信息

如果您需要分页获取已订阅的所有事件状态信息,可以使用 querySubscribeEvent 方法,并指定分页大小和起始索引。

  • Parameter pageSize: 分页大小 [1~200]。
  • Parameter startIndex: 第一页传 0, 下一页取返回所有数据的数组数量(比如 pageSize = 20,第二页传 20,第三页传40)。
//查询类型
SubscribeEvent.SubscribeType type= SubscribeEvent.SubscribeType.USER_PROFILE;
SubscribeEventRequest request = new SubscribeEventRequest(type);
//分页大小,取值范围为[1,200]。
int pageSize=20;
//分页起始索引,第一页传 0, 下一页取返回所有数据的数组数量,比如 pageSize = 20,则第二页传 20,第三页传 40。
int startIndex=0;
RongCoreClient.getInstance().querySubscribeEvent(request,pageSize,startIndex, new IRongCoreCallback.ResultCallback<List<SubscribeInfoEvent>>() {
@Override
public void onSuccess(List<SubscribeInfoEvent> subscribeInfoEvents) {
//查询成功,返回查询用户信息。
}

@Override
public void onError(IRongCoreEnum.CoreErrorCode e) {
//查询失败。
}
});

监听订阅事件

为了接收订阅事件的变更通知,您需要设置订阅监听器。监听器需要在连接之前调用。 注意:从5.10.0版本开始,订阅事件包含了在线状态订阅、用户信息托管这2种类型,订阅事件的变更,需要根据SubscribeType订阅类型来处理对应的业务。

RongCoreClient.getInstance().addSubscribeEventListener(new OnSubscribeEventListener() {
/**
* @param subscribeEvents 订阅事件的列表,包含所有发生变化的事件。
* 被订阅者发生状态变更时,RCSubscribeEvent.operationType 无值。
* 订阅过期没有通知, 开发者需自行关注过期时间。
* 注意:需要判断 SubscribeInfoEvent 的 SubscribeType, 等于 USER_PROFILE 时代表用户信息托管
*/
@Override
public void onEventChange(List<SubscribeInfoEvent> subscribeEvents) {

}

/**
* 标记订阅数据同步完成。 该方法在订阅数据成功同步到设备或系统后调用,用于执行后续处理。
* 注意:需要判断 SubscribeType, 等于 USER_PROFILE 时代表用户信息托管
*
* @param type 同步完成的类型。需要通过根据类型来判断具体是哪种业务同步完成。
* @since 5.10.0
*/
@Override
public void onSubscriptionSyncCompleted(SubscribeEvent.SubscribeType type) {

}

/**
* 当用户在其他设备上的订阅信息发生变更时调用此方法。
* 这可以用于更新当前设备上的用户状态,确保订阅信息的一致性。
* 注意:需要判断 SubscribeInfoEvent 的 SubscribeType, 等于 USER_PROFILE 时代表用户信息托管
* @param subscribeEvents 订阅事件的列表
*/
@Override
public void onSubscriptionChangedOnOtherDevices(List<SubscribeEvent> subscribeEvents) {

}
});