获取SDK当前状态,详见HMR.State
public static State getState()
SDK当前状态
public static void init(@NonNull final Context appContext, final long appId)
初始化Hummer
注意:
Hummer 类的所有接口函数,如无特殊说明,都是异步调用,对接口的调用建议在同一个线程进行。
参数 | 描述 |
---|---|
appContext | 上下文环境 |
appId | 用于标识具体业务, 目前需要和 Hummer 服务提供方通过人工申请 |
public static void open(final long uid,
@NonNull final String region,
@Nullable final Set<String> tags,
@NonNull final String token,
@Nullable final HMR.Completion completion)
登录SDK,同时开始监听服务器消息以及拉取对应消息数据
参数 | 描述 |
---|---|
uid | 用户id, uid 不能为0 |
region | 需要连接服务器所处的环境参数,详情咨询相关SDK开发人员 |
tags | 保留字段,暂时可以填空集合 |
token | 用于服务初始化时所需的用户凭证 |
completion | 完成后的处理回调 |
public static void close(@Nullable final Completion completion)
登出SDK
注意:
- 登出SDK是一个异步操作
- 应该在completion回调中处理错误的情况
参数 | 描述 |
---|---|
completion | 完成后的处理回调 |
public static void refreshToken(@NonNull final String token)
废弃
注意:
该方法已弃用,请改用 refreshToken(String token, HMR.Completion completion)。
刷新用户凭证
参数 | 描述 |
---|---|
token | 待刷新的用户凭证 |
public static void refreshToken(@NonNull final String token,
@Nullable final HMR.Completion completion)
刷新用户凭证
参数 | 描述 |
---|---|
token | 待刷新的用户凭证 |
completion | 回调,会返回对应错误码,业务需要对错误码进行处理 |
public static void addStateListener(@NonNull final StateListener listener)
添加 SDK 状态变更监听器
参数 | 描述 |
---|---|
listener | 待添加的监听器, 详见 StateListener |
public static void removeStateListener(@NonNull final StateListener listener)
移除 SDK 状态变更监听器
参数 | 描述 |
---|---|
listener | 待移除的监听器, 详见 StateListener |
public static void addTokenInvalidListener(@NonNull final TokenInvalidListener listener)
添加 token过期监听器
参数 | 描述 |
---|---|
listener | 待添加的监听器, 详见 TokenInvalidListener |
public static void removeTokenInvalidListener(@NonNull final TokenInvalidListener listener)
移除 token 过期监听器
参数 | 描述 |
---|---|
listener | 待移除的监听器, 详见TokenInvalidListener |
public static String getVersion()
获取 SDK 版本信息
public static <Service> Service getService(@NonNull Class<Service> serviceClass)
获取服务实例
服务实例
public enum State { }
SDK 当前状态
枚举值 | 含义 |
---|---|
Unavailable | 不可用状态, 当 SDK 未初始化时则处于该状态 |
Opening | 正在打开 |
Opened | 已打开 |
Closing | 正在关闭 |
Closed | 已关闭 |
public ChannelState getState()
获取当前连接状态,详见ChannelStateService.ChannelState
SDK当前连接状态
public void addChannelStateListener(@NonNull ChannelStateListener listener)
添加 连接 状态变更监听器
参数 | 描述 |
---|---|
listener | 待添加的监听器, 详见 ChannelStateListener |
public void removeChannelStateListener(@NonNull ChannelStateListener listener)
移除 连接 状态变更监听器
参数 | 描述 |
---|---|
listener | 待移除的监听器, 详见 ChannelStateListener |
void setRegion(String region);
设置聊天室区域
注意:
- 需要在使用聊天室相关功能之前调用设置
- 未设置将默认中国区域
参数 | 描述 |
---|---|
region | 聊天室区域 |
void createChatRoom(@NonNull ChatRoomInfo chatRoomInfo,
@NonNull HMR.CompletionArg<ChatRoom> completion);
创建聊天室
注意:
- 由于聊天室模块的所需的聊天室必须要通过创建才能使用,故需要对应的创建聊天室接口。
- 在创建聊天室完成后,服务器会返回对应的聊天室标识,用于后续在使用聊天室时的标识。
- 同时在创建聊天室时需要提供对应的聊天室信息,如名称、描述、公告以及扩展信息等。
参数 | 描述 |
---|---|
chatRoomInfo | 聊天室信息对象,包含名称、描述、公告以及扩展信息 ,详见ChatRoomInfo |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void dismissChatRoom(@NonNull ChatRoom chatRoom,
@Nullable HMR.Completion completion);
解散聊天室
注意:
- 销毁时需要提供对应的聊天室标识用于服务器识别对应的聊天室,并正常销毁。
- 销毁需要 Owner 权限
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void join(@NonNull ChatRoom chatRoom,
@NonNull Map<String, String> joinProps,
@NonNull Challenges.JoiningCompletion completion);
加入聊天室
注意:
对应聊天室操作都需要进入聊天室之后才能正常的操作,如发公屏、发信令以及接受信令都要进入聊天室之后才能正常处理。
加入聊天室会涉及多端互踢的逻辑,相关互踢逻辑请咨询后台配置。
单个用户进入聊天室:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
joinProps | 扩展字段,用于业务扩展,SDK 只负责透传 |
completion | 一个 JoiningCompletion 对象 - 方法调用成功:本地用户收到回调 onSucceed。 - 方法调用失败:本地用户收到回调 onFailure。错误码详见Code |
void leave(@NonNull ChatRoom chatRoom, @Nullable HMR.Completion completion);
退出聊天室
注意:
在进入聊天室后处理完所有需要处理的逻辑后,可以通过离开聊天室来结束跟聊天室之间的交互,同时也会停止监听聊天室的公屏、信令消息和对应的回调通知。
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void kick(@NonNull ChatRoom chatRoom,
@NonNull User member,
@Nullable Map<EKickInfo, String> extraInfo,
@NonNull HMR.Completion completion);
将用户踢出聊天室
注意:
踢出成员需要对应的角色(Admin 和 Owner) 才可以踢出对应的成员,并且 Admin 不可以踢出 Admin 和 Owner, 而 Owner 可以踢出聊天室内所有成员。角色定义详见:Roles
并且踢出成员以及被踢出的成员都需要在聊天室内可以操作。
踢出成功后,SDK 后台并不会限制该成员无法进入,但是 SDK 会透传给业务服务器,由业务服务器做决定是否允许进入聊天室。
单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
member | 踢出的聊天室成员 |
extraInfo | 踢人的额外信息。key值详见EKickInfo 目前支持的Key主要是两个: 1. Reason, 用于携带踢人原因的 Key, 其 Key 对应的 Value 只需填写对应的踢人原因的字符串即可; 2. Time 用于携带限制时长的 Key(单位:秒), 其 Key 对应的 Value 只需要填写踢人限制时长的秒数转换成字符串即可, 这些字段都是透传字段,服务器不做处理 |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void addRole(@NonNull ChatRoom chatRoom,
@NonNull User member,
@NonNull String role,
@NonNull HMR.Completion completion);
添加聊天室权限角色
注意:
- 聊天室的 Owner 可以给对应的成员添加 Admin 的角色,但是 Admin 没办法给普通成员添加 Admin 的角色。角色定义详见:Roles
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
member | 被添加角色的聊天室成员 |
role | 角色类型,目前只能填写 Admin,详情见ChatRoomService.Roles |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void removeRole(@NonNull ChatRoom chatRoom,
@NonNull User member,
@NonNull String role,
@NonNull HMR.Completion completion);
移除聊天室权限角色
注意:
- 聊天室的 Owner 才可以移除对应的 Admin 角色,但是 Admin 没办法给 Admin 移除角色。角色定义详见:Roles
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
member | 被移除角色的聊天室成员 |
role | 角色类型, 目前只能填写 Admin,详情见ChatRoomService.Roles |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void fetchMembers(@NonNull ChatRoom chatRoom,
int num,
int offset,
@NonNull HMR.CompletionArg<List<User>> completion);
获取聊天室在线成员列表
注意:
- 由于一些场景下,一个聊天室的内的成员可能有十几万,故聊天室 SDK 提供了对应的按需分页获取成员的结果。同时也会按照一定的默认规则来进行排序对应的成员列表。
- 获取成员列表的接口,可以在不进入聊天室时也可以获取。
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
num | 设置每页的返回成员数(建议不超过200) |
offset | 第几页 (第一页从0开始) |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void fetchRoleMembers(@NonNull ChatRoom chatRoom,
boolean online,
@NonNull HMR.CompletionArg<Map<String, List<User>>> completion);
获取聊天室带有角色的成员列表
注意:
获取可以根据需要拉取对应的角色列表,业务可以根据对应的角色列表在界面上展示不同的UI界面以及赋予对应角色权限。
获取角色列表无需进入聊天室后获取,进入聊天室前即可获取。
单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
online | 是否只获取在线的成员: true:只获取在线的、有角色的列表 false:获取所有带有角色的成员列表 |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void fetchBasicInfo(@NonNull ChatRoom chatRoom,
@NonNull HMR.CompletionArg<ChatRoomInfo> completion);
获取聊天室基本属性信息
注意:
- 获取聊天室信息可以获取到对应聊天室的名称、描述、公告以及对应的扩展字段信息。
- 获取聊天室信息无需进入聊天室也可以获取。
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void fetchChatRoomInfo(@NonNull ChatRoom chatRoom,
@Nullable HMR.CompletionArg<Map<String, String>> completion);
获取聊天室全部属性信息
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
completion | 获取完成后的回调,业务可以根据对应的获取结果做不同的业务逻辑处理,在获取成功后可以从对应的参数中获取到对应的聊天室信息 |
void fetchMemberCount(@NonNull ChatRoom chatRoom,
@NonNull HMR.CompletionArg<Integer> completion);
获取聊天室人数
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
completion | 获取完成后的回调 |
void changeBasicInfo(@NonNull ChatRoom chatRoom,
@NonNull Map<ChatRoomInfo.BasicInfoType, String> propInfo,
@NonNull HMR.Completion completion);
变更聊天室基本属性信息
注意:
- 可以修改一个或多个属性,只需要在参数中指定需要修改的聊天室信息的键值对即可。
- 需要 Admin 或者 Owner 的角色。角色定义详见:Roles
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
propInfo | 修改的属性值,其中key值参见枚举详见:ChatRoomInfo.BasicInfoType |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void addOrUpdateChatRoomInfo(@NonNull ChatRoom chatRoom,
@NonNull Map<String, String> infoMap,
@Nullable HMR.Completion completion);
更新指定聊天室的属性信息
注意:
属性信息存在则更新;不存在则添加
参数 | 描述 |
---|---|
chatRoom | 聊天室标识符 |
infoMap | 修改的属性值,可自定义 |
completion | 改完成后的回调,业务可以根据对应的修改结果做不同的业务处理 |
void muteMember(@NonNull ChatRoom chatRoom,
@NonNull User member,
@Nullable String reason,
@NonNull HMR.Completion completion);
禁言聊天室内的成员
注意:
- 业务可以根据对应的需要禁言某个成员,目前后台默认的禁言时间为三天,到期自动解禁。
- 禁言需要 Admin 或者 Owner 的角色, Owner 可以禁言聊天室内的所有人包括 Admin, 而 Admin 则只可以禁言普通成员。角色定义详见:Roles
- 禁言的成员需要在聊天室内。
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 成员所在的聊天室 |
member | 需要禁言的成员 |
reason | 禁言的原因 |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void unmuteMember(@NonNull ChatRoom chatRoom,
@NonNull User member,
@Nullable String reason,
@NonNull HMR.Completion completion);
解禁聊天室内的成员
注意:
- 解禁的成员需要在聊天室内
- 解除禁言需要 Admin 或者 Owner 的角色, Owner 可以解禁聊天室内的所有人包括 Admin, 而 Admin 则只可以解禁普通成员。角色定义详见:Roles
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 成员所在的聊天室 |
member | 需要解禁言的成员 |
reason | 解禁言的原因 |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见[Code]( |
void fetchMutedUsers(@NonNull ChatRoom chatRoom,
@NonNull HMR.CompletionArg<Set<User>> completion);
获取聊天室内的禁言列表
注意:
- 获取的禁言列表里面的有些用户可能不存在聊天室内
- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 需要获取禁言列表的聊天室 |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void isMuted(@NonNull ChatRoom chatRoom,
@NonNull User member,
@NonNull HMR.CompletionArg<Boolean> completion);
判别某一个用户是否在聊天室的禁言列表里
注意:
单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 需要判别的聊天室 |
member | 需要判别的用户 |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void setUserInfo(@NonNull final ChatRoom chatRoom,
@NonNull final Map<String, String> infoMap,
@Nullable final HMR.Completion completion);
设置自己的用户信息
注意:
- 容量上限:
设置用户属性,最大支持属性个数:32个
单个用户属性的最大值:8k- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 成员所在的聊天室 |
infoMap | 待设置用户信息 |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void deleteUserInfoByKeys(@NonNull ChatRoom chatRoom,
@NonNull Set<String> keys,
@Nullable HMR.Completion completion);
删除自己的用户信息
注意:
- 容量上限:
用户属性,最大支持属性个数:32个
单个用户属性的最大值:8k- 单个用户调用频率限制:10次/5s
参数 | 描述 |
---|---|
chatRoom | 成员所在的聊天室 |
keys | 待删除信息的key |
completion | 一个 Completion 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void addOrUpdateUserInfo(@NonNull ChatRoom chatRoom,
@NonNull Map<String, String> infoMap,
@Nullable HMR.Completion completion);
添加或更新指定用户信息。
注意:
属性信息存在则更新;不存在则添加。
参数 | 描述 |
---|---|
chatRoom | 成员所在的聊天室 |
infoMap | 属性信息 |
completion | 设置信息返回的回调,可以根据错误码进行处理 |
void fetchUserInfo(@NonNull ChatRoom chatRoom,
@NonNull User member,
@NonNull HMR.CompletionArg<Map<String, String>> completion
获取指定用户的用户信息
参数 | 描述 |
---|---|
chatRoom | 成员所在的聊天室 |
member | 目标用户 |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void batchFetchUserInfos(@NonNull ChatRoom chatRoom,
@NonNull Set<User> users,
@Nullable HMR.CompletionArg<Map<User, Map<String, String>>> completion);
批量获取指定用户的用户信息
参数 | 描述 |
---|---|
chatRoom | 成员所在的聊天室 |
users | 目标用户(批量) |
completion | 设置信息返回的回调,可以根据错误码进行处理 |
void fetchOnlineUserInfoList(@NonNull ChatRoom chatRoom,
@NonNull HMR.CompletionArg<Map<User, Map<String, String>>> completion);
获取聊天室已设置用户信息的在线成员列表
注意:
获取的人员列表最多返回100个,超过100个的随机返回100个
参数 | 描述 |
---|---|
chatRoom | 待查询聊天室 |
completion | 一个 CompletionArg 对象 - 方法调用成功:本地用户收到回调 onSuccess。 - 方法调用失败:本地用户收到回调 onFailed。错误码详见Code |
void addListener(@NonNull final ChatRoomListener listener);
添加聊天室回调监听器
参数 | 描述 |
---|---|
listener | 监听器对象, 详见 ChatRoomListener |
void removeListener(@NonNull final ChatRoomListener listener);
移除聊天室回调监听器
参数 | 描述 |
---|---|
listener | 监听器对象, 详见 ChatRoomListener |
void addMemberListener(@NonNull final MemberListener listener);
添加聊天室成员回调监听器
参数 | 描述 |
---|---|
listener | 监听器对象, 详见 MemberListener |
void removeMemberListener(@NonNull final MemberListener listener);
移除聊天室成员的回调监听器
参数 | 描述 |
---|---|
listener | 监听器对象, 详见 MemberListener |
void send(@NonNull Message message, @Nullable HMR.Completion completion);
发送公屏(仅支持文本)、单播、广播消息,消息内容详情见 Content。
说明:
- 业务可以通过自己构造消息体,并且填写对应的消息内容将该消息发送出去。
- 该接口也可以在消息发送失败的情况下进行重发消息。
- 单个用户调用频率限制:
发送公屏消息:10次/5s
发送自定义单播消息:50次/5s
发送自定义广播消息:50次/5s- 单条消息最大长度:
单播:2k
广播:2k
公屏:1200字节- 消息的拓展字段
kvExtra
最多32个- 对于单播、广播,如果message的
appExtra
填了值,会默认加入到kvExtra
中作为一个单独的key-value,即自定义的kvExtra
的最大个数变为31个
参数 | 描述 |
---|---|
message | 消息实例 |
completion | 发送操作的完成回调 |
completion
回调只处理了最终完成回调,但消息发送过程中可能会有多个阶段/状态。可以通过监听MessageListener来得到相应的回调。
void addMessageListener(@Nullable Identifiable target, @NonNull MessageListener listener);
添加一个消息收发监听器
参数 | 描述 |
---|---|
target | 欲监听消息收发的消息对象 |
listener | 欲增加的listener对象 |
void removeMessageListener(@Nullable Identifiable target, @NonNull MessageListener listener);
移除一个消息收发监听器
参数 | 描述 |
---|---|
target | 欲取消监听消息收发的消息对象 |
listener | 欲移除的listener对象 |
public interface Completion {
// 成功回调
void onSuccess();
// 失败回调
void onFailed(Error err);
}
异步结果回调
public interface CompletionArg<Argument> {
// 成功回调,
void onSuccess(Argument arg);
// 失败回调
void onFailed(Error err);
}
enum ChannelState {
Unavailable,
Disconnected,
Connecting,
Connected,
}
枚举值 | 含义 |
---|---|
Unavailable | 通道还未初始化 |
Disconnected | 通道处于断开连接的状态 |
Connecting | 通道处于连接中的状态 |
Connected | 通道处于连接成功的状态 |
public final class ChatRoomInfo {
public enum BasicInfoType {
Name,
Description,
Bulletin,
AppExtra,
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public String getBulletin() {
return bulletin;
}
public String getAppExtra() {
return appExtra;
}
public ChatRoomInfo(@NonNull String name, @Nullable String description,
@Nullable String bulletin, @Nullable String appExtra) {
this.name = name;
this.description = description;
this.bulletin = bulletin;
this.appExtra = appExtra;
}
private final String name;
private final String description;
private final String bulletin;
private final String appExtra;
}
public enum BasicInfoType {
Name,
Description,
Bulletin,
AppExtra,
}
聊天室基础信息的枚举字段:主要用来修改聊天室信息和监听聊天室信息时候,可以标识那个字段发生变化/需要修改
枚举值 | 含义 |
---|---|
Name | 聊天室名字 |
Description | 聊天室描述 |
Bulletin | 聊天室公告 |
AppExtra | 聊天室扩展字段(最大1K) |
final class Signal extends Content {
public final User user;
public final String content;
public static Signal unicast(@NonNull User user, @NonNull String content) {
return new Signal(user, content);
}
public static Signal broadcast(@NonNull String content) {
return new Signal(null, content);
}
private Signal(User user, @NonNull String content) {
this.user = user;
this.content = content;
}
@Override
public String toString() {
return "ChatRoom.Signal{" + content + "}";
}
}
public interface JoiningCompletion {
void onSucceed();
void onFailure(@NonNull Error error);
// 预留
void onReceiveChallenge(Challenges.Password challenge);
// 预留
void onReceiveChallenge(Challenges.AppChallenge challenge);
}
enum EKickInfo {
Time,
Reason,
}
final class Roles {
// 管理员
public static final String Admin = "admin";
// 房主
public static final String Owner = "owner";
}
public class KickOff {
/**
* 踢人原因
*/
private String reason;
/**
* 踢人类型
*/
private KickOffEnum kickOffEnum;
public KickOff(String reason, KickOffEnum kickOffEnum) {
this.reason = reason;
this.kickOffEnum = kickOffEnum;
}
public String getReason() {
return reason;
}
public KickOffEnum getKickOffEnum() {
return kickOffEnum;
}
}
public enum KickOffEnum {
/**
* 被踢
*/
KICK_OFF(0),
/**
* 多端互踢
*/
MULTIJOIN_KICK_OFF(1),
/**
* 未定义
*/
UNDEFINED(-1);
private int type;
KickOffEnum(int type) {
this.type = type;
}
public int getType() {
return type;
}
}
public final class Message {
/**
* 构造一个空的ChatMessage对象
*/
public Message() {
}
/**
* 构造一个预设了消息接收者和消息内容的ChatMessage对象
*
* @param receiver 消息接收的目标
* @param content 消息内容
*/
public Message(Identifiable receiver, Content content) {
this.chatContent = content;
this.receiver = receiver;
this.timestamp = 0L;
}
/**
* ChatMessage的状态抽象概念
*/
public interface State {
}
/**
* 获取消息内容
*/
public Content getContent() {
return this.chatContent;
}
/**
* 设置消息内容
*/
public void setContent(Content content) {
this.chatContent = content;
}
/**
* 消息的发送者,由于是聊天消息(Message),其产生源一定是用户,因此其类型只可能是User
* 如果是user实例,在进行会话界面渲染时,可以通过HMR.isMe()来快速判断该消息是否由当前用户所发送。
*/
public Identifiable getSender() {
return sender;
}
/**
* 设置消息的发送方。如果是本地发送出去的消息,会在调用ChatService.send方法时被自动覆盖为本地用户(Me)
*
* @param sender 消息的发送者
*/
public void setSender(Identifiable sender) {
this.sender = sender;
}
/**
* 消息的接收者,具体类型是多态的,可能为Person(用户聊天会话),Group(群组聊天会话)……
*/
public Identifiable getReceiver() {
return receiver;
}
/**
* 设置消息接收者。对于本地发出的消息,业务必须显示为ChatMessage显示设置Receiver属性。
*
* @param receiver 消息接收者
*/
public void setReceiver(Identifiable receiver) {
this.receiver = receiver;
}
/**
* 对于当前用户来说,该方法用于返回聊天对应的目标对象。
*
* @return 如果是P2P消息,返回当前用户以外的用户对象。如果是群、聊天室、官方号等消息,返回receiver作为target
*/
public Identifiable getTarget() {
// 对于P2P聊天消息,判断会话目标的逻辑表如下:
// 1. sender: me, receiver: me <- receiver
// 2. sender: me, receiver: fellow <- receiver
// 3. sender: fellow, receiver: me <- sender
// 4. sender: fellow, receiver: fellow <- N/A 我方不该收到该消息
if (sender instanceof User && receiver instanceof User) {
if (HMR.isMe(sender)) {
return receiver;
} else if (HMR.isMe(receiver)) {
return sender;
} else {
return null;
}
}
// 对于如群消息、聊天室消息、公众号消息等非P2P消息,receiver一定是该关系对象本身
// sender为发送消息到该关系的人,因此可以直接返回receiver
return receiver;
}
/**
* timestamp属性为消息时间戳,在消息发送(将发送)时,该时间戳为设备本地的时间戳,当发送完成时,该时间戳为Hummer服务器
* 返回的时间戳。考虑到本地时间和服务器时间可能存在时差,以及服务器集群中,各服务器间的时间存在时间差等原因,该时间戳
* 只能作为近似(绝大部分情况下)判别消息先后顺序的依据。
*/
public long getTimestamp() {
return this.timestamp;
}
/**
* 设置消息的时间戳
*/
public void setTimestamp(long ts) {
this.timestamp = ts;
}
/**
* uuid为消息的(近似)唯一标识id,由于uuid是在各个客户端本地独立产生的,因此理论上存在碰撞的可能性。但由于这
* 种概率极其低,因此可以用作消息的唯一识别标识,对消息进行去重等操作。
*/
public String getUuid() {
return this.uuid;
}
/**
* 设置消息唯一标识符,该标识符通常是由Hummer内部产生并设置的,业务一般不调用该方法
*/
public void setUuid(String id) {
this.uuid = id;
}
/**
* 每个ChatMessage对象都可以附带一个业务扩展信息。该信息可以帮助业务透传例如用户头像等业务逻辑紧密相关的数据。Hummer只
* 对该数据进行透传,不做具体解释和处理。
*/
public String getAppExtra() {
return appExtra;
}
/**
* 设置消息的业务透传数据
*/
public void setAppExtra(String appExtra) {
this.appExtra = appExtra;
}
private String uuid;
private Identifiable sender;
private Identifiable receiver;
private PushContent pushContent;
private Long timestamp;
private String appExtra;
private Content chatContent;
}
属性(值) | 说明 |
---|---|
uuid | 消息的唯一标识 |
sender | 消息的发送者。详情见Identifiable |
receiver | 消息的接收者。详情见Identifiable |
timestamp | 消息时间戳 |
appExtra | 消息附加信息。业务可以解析该属性,做特殊处理 |
chatContent | 消息内容:文本、单播、广播。详见Content |
唯一标识抽象类
public abstract class Identifiable {
/**
* 无论是User,还是Chatroom,都必须具备唯一标识符,getId用于返回该标识符。
* 但是User和Chatroom可能会拥有相同的id值。
* 因此,必须谨记,无法通过id值的特征来判断不同的消息sender, receiver。
*/
public abstract long getId();
}
实现类 | 说明 |
---|---|
User | 用户唯一标识类,详见User |
ChatRoom | 聊天室唯一标识类,详见ChatRoom |
标识Hummer系统的一个用户对象标识
public final class User extends Identifiable {
/**
* 构造用户标识对象
* @param uid 用户uid,对Hummer来说,当uid为0时,表示匿名用户
*/
public User(long uid) {
this.uid = uid;
}
/**
* 获取用户标识的id数值
*/
@Override
public long getId() {
return uid;
}
private final long uid;
}
聊天室唯一标识类
public final class ChatRoom extends Identifiable {
public ChatRoom(long id) {
this.roomId = id;
}
@Override
public long getId() {
return roomId;
}
private final long roomId;
}
用于表示一个聊天内容类型,具体类型应该由其子类来实现。例如Text, Signal等
public class Content {}
继承类 | 说明 |
---|---|
Text | 文本消息内容类型。详情见Text |
Signal | 聊天室的信令消息(单播、广播)。详情见ChatRoomService.Signal |
文本消息内容类型
public final class Text extends Content {
/**
* 构造一个文本消息
* @param text 消息的文本内容
*/
public Text(String text) {
this.text = text;
}
/**
* 获取消息的文本
*/
public String getText() {
return text;
}
private String text;
}
Hummer中用于表示通用错误的类型,常见于消息收发等需要网络通讯的请求中。Error.code的枚举详见:Code
public final class Error {
/**
* code属性主要用于进行机器判别、日志快速定位等作用
*/
public final int code;
/**
* reason属性通过人可读的文本形式对mCode进行了描述
*/
public final String desc;
/**
* 构造Error实例,
*
* @param code 处理结果的代码
* @param desc 处理结果的文本描述
*/
public Error(int code, String desc) {
this.code = code;
this.desc = desc;
}
}