用户资料

云信提供了用户资料托管,包含生日,Email,性别,手机号码,签名和扩展字段的管理,参考 NimUserInfo 说明,第三方 APP 可以使用也可以自行实现,但必须实现 UserInfoProvider.UserInfo 接口。

返回值 NimUserInfo 接口 说明
String getBirthday() 获取生日
String getEmail() 获取 Email
String getExtension() 获取扩展字段
Map getExtensionMap() 获取扩展字段,返回 Map 格式
GenderEnum getGenderEnum() 获取性别
String getMobile() 获取手机号码
String getSignature() 获取签名
返回值 UserInfoProvider.UserInfo 接口 说明
String getAccount() 返回用户帐号
String getAvatar() 返回用户头像地址
String getName() 返回用户名

获取用户资料

从本地获取用户资料

由于用户资料变更需要跨进程异步调用,开发者最好能在第三方 APP 中做好用户资料缓存,查询用户资料时都从本地缓存中访问。在用户资料有变化时,SDK 会告诉注册的观察者,此时,第三方 APP 可更新缓存,并刷新界面。

获取批量用户资料

通过用户帐号集合,从本地数据库批量获取用户资料列表。

/**
 * 从本地数据库中批量获取用户资料(同步接口)
 *
 * @param accounts 要获取的用户帐号集合
 * @return 用户资料列表
 */
List<NimUserInfo> getUserInfoList(List<String> accounts);
参数 说明
accounts 要获取的用户帐号集合
List<NimUserInfo> users = NIMClient.getService(UserService.class).getUserInfoList(accounts);

获取指定用户资料

通过用户账号,从本地数据库获取用户资料。

/**
 * 从本地数据库中获取用户资料(同步接口)
 *
 * @param account 要获取的用户账号
 * @return 用户资料
 */
NimUserInfo getUserInfo(String account);
NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(account);

获取所有用户资料

获取本地数据库中所有的用户资料,一般适合在登录后构建用户资料缓存时使用。

/**
 * 获取本地数据库中所有用户资料
 *
 * @return 所有用户资料列表
 */
List<NimUserInfo> getAllUserInfo();
List<NimUserInfo> users = NIMClient.getService(UserService.class).getAllUserInfo();

用户资料更新时机

SDK本地用户资料除自己之外,不保证其他用户资料实时更新。其他用户数据更新时机为:

从云端获取用户资料

从服务器获取用户资料,一般在本地用户资料不存在时调用,获取后 SDK 会负责更新本地数据库。每次最多获取150个用户,如果量大,上层请自行分批获取。

/**
 * 从服务器获取用户资料(每次最多获取150个用户,如果量大,上层请自行分批获取)
 *
 * @param accounts 要获取的用户帐号
 * @return InvocationFuture 可以设置回调函数。在用户资料存入数据库后就会回调。
 */
InvocationFuture<List<NimUserInfo>> fetchUserInfo(List<String> accounts);
NIMClient.getService(UserService.class).fetchUserInfo(accounts)
    .setCallback(new RequestCallback<List<UserInfo>>() { ... });

说明:此接口可以批量从服务器获取用户资料,从用户体验和流量成本考虑,不建议应用频繁调用此接口。对于用户数据实时性要求不高的页面,应尽量调用读取本地缓存接口。

编辑用户资料

/**
 * 更新本人用户资料
 *
 * @param fields 要更新的字段和新值, key为字段,value为对应的值
 * @return @return InvocationFuture 可以设置回调函数。
 */
InvocationFuture<Void> updateUserInfo(Map<UserInfoFieldEnum, Object> fields);
参数 说明
fields 要更新的字段和新值, key 为字段,value 为对应的值

传入参数 Map<UserInfoFieldEnum, Object> 更新用户本人资料,key 为字段,value 为对应的值。具体字段见 UserInfoFieldEnum

UserInfoFieldEnum 属性说明:

参数 说明
AVATAR 头像URL
BIRTHDAY 生日
EMAIL 电子邮箱
EXTEND 扩展字段
GENDER 性别
MOBILE 手机
Name 昵称
SIGNATURE 签名
undefined 未定义的域
字段 说明
邮箱 必须为合法邮箱
手机号 必须为合法手机号 如 13588888888、+(86)-13055555555
生日 必须为 "yyyy-MM-dd" 格式
Map<UserInfoFieldEnum, Object> fields = new HashMap<>(1);
fields.put(UserInfoFieldEnum.Name, "new name");
NIMClient.getService(UserService.class).updateUserInfo(fields)
    .setCallback(new RequestCallbackWrapper<Void>() { ... });

头像资源处理

如要更新头像时,需要先将头像图片上传到云端后,再将 URL 传给 SDK。可以使用云信提供文件资源上传与下载服务,或其他第三方服务。

云信自带的文件资源上传与下载服务由接口 NosService 与 NosServiceObserve 提供,详见 客户端API文档。

用户资料变更回调

/**
 * 用户资料变更观察者通知
 *
 * @param observer 观察者,参数为更新后的用户资料列表
 * @param register true为注册,false为注销
 */
void observeUserInfoUpdate(Observer<List<NimUserInfo>> observer, boolean register);
// 注册/注销观察者
NIMClient.getService(UserServiceObserve.class).observeUserInfoUpdate(userInfoUpdateObserver, register);
// 用户资料变更观察者
private Observer<List<UserInfo>> userInfoUpdateObserver = new Observer<List<UserInfo>>() {
    @Override
    public void onEvent(List<UserInfo> users) {
    ...
    }
};

用户检索

根据昵称检索

从本地数据库中获取具有指定昵称的用户的账号列表

/**
 * 根据昵称反查账号
 *
 * @param name 昵称
 * @return 账号
 */
InvocationFuture<List<String>> searchAccountByName(String name);
NIMClient.getService(UserService.class).searchAccountByName("nick").setCallback(new RequestCallbackWrapper<List<String>>() {
    @Override
    public void onResult(int code, List<String> result, Throwable exception) {
        if (code == ResponseCode.RES_SUCCESS) {
            // 成功
        } else {
            // 失败,错误码见code
        }

        if (exception != null) {
            // error
        }
    }
});

根据关键字检索

搜索与关键字匹配的所有用户:

/**
 * 搜索与关键字匹配的所有用户
 *
 * @param keyword 关键字
 * @return NimUserInfo
 */
InvocationFuture<java.util.List<NimUserInfo>> searchUserInfosByKeyword(java.lang.String keyword);