用户资料托管

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

NimUserInfo 接口说明:

返回值 NimUserInfo 接口 说明
String getBirthday() 获取生日
String getEmail() 获取 Email
String getExtension() 获取扩展字段
Map getExtensionMap() 获取扩展字段,返回 Map 格式
GenderEnum getGenderEnum() 获取性别
String getMobile() 获取手机号码
String getSignature() 获取签名

UserInfoProvider.UserInfo 接口说明:

返回值 UserInfoProvider.UserInfo 接口 说明
String getAccount() 返回用户帐号
String getAvatar() 返回用户头像地址
String getName() 返回用户名

获取本地用户资料

从本地数据库中批量获取用户资料

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

/**
 * 从本地数据库中批量获取用户资料(同步接口)
 *
 * @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();

构建通讯录

如果使用网易云通信用户关系、用户资料托管,构建通讯录,先获取我所有好友帐号,再根据帐号去获取对应的用户资料。

/**
 * 获取我所有的好友帐号
 *
 * @return 好友帐号集合
 */
List<String> getFriendAccounts();
List<String> accounts = NIMClient.getService(FriendService.class).getFriendAccounts(); // 获取所有好友帐号
List<NimUserInfo> users = NIMClient.getService(UserService.class).getUserInfoList(accounts); // 获取所有好友用户资料

获取服务器用户资料

从服务器获取用户资料,一般在本地用户资料不存在时调用,获取后 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>>() { ... });

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

编辑用户资料

更新用户本人资料

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

UserInfoFieldEnum 属性说明:

参数 说明
AVATAR 头像URL
BIRTHDAY 生日
EMAIL 电子邮箱
EXTEND 扩展字段
GENDER 性别
MOBILE 手机
Name 昵称
SIGNATURE 签名
undefined 未定义的域
/**
 * 更新本人用户资料
 *
 * @param fields 要更新的字段和新值, key为字段,value为对应的值
 * @return @return InvocationFuture 可以设置回调函数。
 */
InvocationFuture<Void> updateUserInfo(Map<UserInfoFieldEnum, Object> fields);
参数 说明
fields 要更新的字段和新值, key 为字段,value 为对应的值
Map<UserInfoFieldEnum, Object> fields = new HashMap<>(1);
fields.put(UserInfoFieldEnum.Name, "new name");
NIMClient.getService(UserService.class).updateUserInfo(fields)
    .setCallback(new RequestCallbackWrapper<Void>() { ... });

先将头像图片上传至网易云通信云存储上(见 NosService ) ,上传成功后可以得到 url 。 更新个人资料的头像字段,保存 url 。

此外,开发者也可以自行存储头像,仅将 url 更新到个人资料上。

字段 说明
邮箱 必须为合法邮箱
手机号 必须为合法手机号 如 13588888888、+(86)-13055555555
生日 必须为 "yyyy-MM-dd" 格式

监听用户资料变更

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

1. 调用 fetchUserInfo 方法刷新用户

2. 收到此用户发来消息(如果消息发送者有资料变更,SDK 会负责更新并通知)

3. 程序再次启动,此时会同步好友信息

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

/**
 * 用户资料变更观察者通知
 *
 * @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) {
    ...
    }
};