消息回复
NIM SDK 提供会话消息回复(Thread)功能,可引用接收到的某一条消息进行针对性的回复,形成起始于该消息的消息回复树状结构。通过该功能,用户可针对某一条消息进行提问、反馈或补充相关背景信息,且不会对频道内的会话流造成干扰。
Thread 指以一条消息作为根消息的消息回复树状结构,示例见下图。
上图中:
- 消息 A 是消息 B 的父消息,消息 B1 是消息 C 的父消息
- 消息 C 是消息 B1 的子消息
- 消息 A 是消息 B 和消息 C 的根消息
- 消息 A、B、C 统称为 Threaded Message(串联起来的消息)
- 一条 Threaded Message 必须有一条父消息或至少一条子消息。如果一条消息既没有父消息,也没有子消息,则为普通消息。
- 若未开通回复功能,回复时系统会自动将所发消息转换为一条普通消息。若需要 thread 回复能力,请至云信控制台应用管理 > 产品功能 > IM 即时通讯 > 全局功能开通会话消息回复。
消息回复
java
InvocationFuture<Void> replyMessage(IMMessage msg, IMMessage replyMsg, boolean resend);
参数 |
说明 |
msg |
带发送的消息体,由{@link MessageBuilder}构造 |
replyMsg |
被回复的消息 |
resend |
如果是发送失败后重发,标记为true,否则填false |
javaNIMClient.getService(MsgService.class).replyMessage(message, replymessage.get(0), false).setCallback(new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
}
@Override
public void onFailed(int code) {
}
@Override
public void onException(Throwable exception) {
}
})
注意:在超大群中,回复消息应使用 SuperTeamService
。
查询thread聊天云端历史
java
InvocationFuture<ThreadTalkHistory> queryThreadTalkHistory(IMMessage anchor, long fromTime, long toTime, int limit, QueryDirectionEnum direction, boolean persist);
参数 |
说明 |
anchor |
查找锚点,查找对象为此消息所在的 thread 会话中的消息 |
fromTime |
起始时间 |
toTime |
终止时间 |
limit |
条数限制 |
direction |
方向 |
persist |
是否持久化 |
javaNIMClient.getService(MsgService.class).queryThreadTalkHistory(replymessage.get(0), aTime, tTime, msgCount, direction, true).setCallback(new RequestCallback<ThreadTalkHistory>() {
@Override
public void onSuccess(ThreadTalkHistory thread) {
if (thread == null) {
Toast.makeText(SessionExtension.this, R.string.msg_history_empty, Toast.LENGTH_SHORT).show();
return;
}
MsgHistoryActivity.startActivity(SessionExtension.this, thread.getReplyList());
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable throwable) {
Log.e(TAG, "pull server message exception:" + throwable);
}
});
获取thread消息回复数
本地获取某thread消息的回复消息的条数。
java
int queryReplyCountInThreadTalkBlock(IMMessage msg);
javaint count = NIMClient.getService(MsgService.class).queryReplyCountInThreadTalkBlock(replymessage.get(0));
快捷评论
可以对消息进行快捷评论。评论内容并非一条消息,而是一个long类型,由上层指定评论内容与界面展示之间的联系。单应用支持最多 500 条快捷评论。
增加评论
java
InvocationFuture<Long> addQuickComment(IMMessage msg, long replyType, String ext, boolean needPush, boolean needBadge, String pushTitle, String pushContent, Map<String, Object> pushPayload);
参数 |
说明 |
msg |
回复对象 |
replyType |
回复类型,最小值为整数1 |
ext |
自定义扩展字段,最大8字符 |
needPush |
是否需要推送 |
needBadge |
是否需要角标 |
pushTitle |
推送标题 |
pushContent |
推送内容 |
pushPayload |
第三方自定义的推送属性,限制json类型 |
javaNIMClient.getService(MsgService.class).addQuickComment(message, replytype, qcmsgExtEdit.getText().toString(), needpush, needbadge,
pushTitleEdit.getText().toString(), pushContentEdit.getText().toString(), null).setCallback(new RequestCallback<Long>() {
@Override
public void onSuccess(Long param) {
Toast.makeText(SessionExtension.this, "增加一条快捷评论成功", Toast.LENGTH_SHORT).show();
showOnLog(logText, logJson.toString());
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
});
删除评论
java
InvocationFuture<Long> removeQuickComment(IMMessage msg, long replyType, String ext, boolean needPush, boolean needBadge, String pushTitle, String pushContent, Map<String, Object> pushPayload);
参数 |
说明 |
msg |
回复对象 |
replyType |
回复类型,最小值为整数1 |
ext |
自定义扩展字段,最大8字符 |
needPush |
是否需要推送 |
needBadge |
是否需要角标 |
pushTitle |
推送标题 |
pushContent |
推送内容 |
pushPayload |
第三方自定义的推送属性,限制json类型 |
javaNIMClient.getService(MsgService.class).removeQuickComment(message, replytype, qcmsgExtEdit.getText().toString(), needpush, needbadge,
pushTitleEdit.getText().toString(), pushContentEdit.getText().toString(), null).setCallback(new RequestCallback<Long>() {
@Override
public void onSuccess(Long param) {
Toast.makeText(SessionExtension.this, "删除一条快捷评论成功", Toast.LENGTH_SHORT).show();
showOnLog(logText, logJson.toString());
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
});
获取评论
java
InvocationFuture<List<QuickCommentOptionWrapper>> queryQuickComment(List<IMMessage> msgList);
参数 |
说明 |
msgList |
每个元素是被查询快捷评论的消息,数量不超过20 |
javaNIMClient.getService(MsgService.class).queryQuickComment(msglist).setCallback(new RequestCallback<List<QuickCommentOptionWrapper>>() {
@Override
public void onSuccess(List<QuickCommentOptionWrapper> param) {
showQuickComment(logText, logJson.toString());
}
@Override
public void onFailed(int code) {
}
@Override
public void onException(Throwable exception) {
}
});
收藏夹
允许用户添加一个 20k 以内的字符串作为收藏。单应用支持最多 1000 个收藏。
添加一条收藏
java
InvocationFuture<CollectInfo> addCollect(int type, String date, String ext, String uniqueId);
参数 |
说明 |
type |
收藏类型 |
date |
收藏内容,最大20k |
ext |
扩展字段,最大1k |
uniqueId |
去重唯一ID |
javaNIMClient.getService(MsgService.class).addCollect(1, logJson.toString(), extEdit.getText().toString(), UniqueIdEdit.getText().toString()).setCallback(
new RequestCallback<CollectInfo>() {
@Override
public void onSuccess(CollectInfo param) {
Toast.makeText(SessionExtension.this, "添加收藏成功", Toast.LENGTH_SHORT).show();
showOnLog(logText, logJson.toString());
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
}
);
批量移除收藏
java
InvocationFuture<Integer> removeCollect(List<Pair<Long, Long>> collectInfo);
参数 |
说明 |
collectInfo |
要移除的收藏的关键信息组成的列表,每一项为一个Pair,其中第一项为收藏的ID,第二项为收藏的创建时间 |
javaNIMClient.getService(MsgService.class).removeCollect(collectInfo).setCallback(
new RequestCallback<Integer>() {
@Override
public void onSuccess(Integer param) {
Toast.makeText(SessionExtension.this, "批量移除收藏成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
}
);
更新收藏的扩展字段
java
InvocationFuture<CollectInfo> updateCollect(long infoId, long createTime, String ext);
参数 |
说明 |
infoId |
要更新的收藏的ID |
createTime |
要更新的收藏的创建时间 |
ext |
更新后的扩展字段 |
javaNIMClient.getService(MsgService.class).updateCollect(collectId,collectCreateTime,extEdit.getText().toString()).setCallback(new RequestCallback<CollectInfo>() {
@Override
public void onSuccess(CollectInfo param) {
Toast.makeText(SessionExtension.this, "更新一个收藏的扩展字段成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
});
分页查询收藏列表
java
InvocationFuture<CollectInfoPage> queryCollect(CollectInfo anchor, long toTime, int limit, QueryDirectionEnum direction);
参数 |
说明 |
anchor |
结束查询的最后一条收藏(不包含在查询结果中) |
toTime |
结束时间点单位毫秒 |
limit |
本次查询的消息条数上限(最多100条) |
direction |
查询方向 |
javaNIMClient.getService(MsgService.class).queryCollect(null, tTime, limit, direction).setCallback(
new RequestCallback<CollectInfoPage>() {
@Override
public void onSuccess(CollectInfoPage param) {
if (param == null) {
Toast.makeText(SessionExtension.this, "从服务的分页查询收藏列表为空",
Toast.LENGTH_SHORT).show();
return;
}
addCollects(param.getCollectList());
}
@Override
public void onFailed(int code) {
}
@Override
public void onException(Throwable exception) {
}
}
);
PIN标记
一条消息可以被所在会话的所有用户PIN,取消PIN和查询PIN,以及更新扩展字段。每个用户账号最多 PIN 100 条消息。
一条消息只能有一个PIN,多个用户PIN同一条消息时,较晚的PIN会覆盖较早的PIN。
PIN一条消息
java
InvocationFuture<Long> addMsgPin(IMMessage msg, String ext);
参数 |
说明 |
msg |
被PIN的消息 |
ext |
扩展字段 |
javaNIMClient.getService(MsgService.class).addMsgPin(message, pinmsgExtEdit.getText().toString()).setCallback(new RequestCallback<Long>() {
@Override
public void onSuccess(Long param) {
Toast.makeText(SessionExtension.this, "PIN一条消息成功", Toast.LENGTH_SHORT).show();
showOnLog(logText, logJson.toString());
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
});
更新一条消息的PIN
java
InvocationFuture<Long> updateMsgPin(IMMessage msg, String ext);
参数 |
说明 |
msg |
被PIN的消息 |
ext |
扩展字段 |
javaNIMClient.getService(MsgService.class).updateMsgPin(message, pinmsgExtEdit.getText().toString()).setCallback(new RequestCallback<Long>() {
@Override
public void onSuccess(Long param) {
Toast.makeText(SessionExtension.this, "更新一条消息的PIN成功", Toast.LENGTH_SHORT).show();
showOnLog(logText, logJson.toString());
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
});
移除一条消息的PIN
java
InvocationFuture<Long> removeMsgPin(IMMessage msg, String ext);
参数 |
说明 |
msg |
被PIN的消息 |
ext |
扩展字段 |
javaNIMClient.getService(MsgService.class).removeMsgPin(message, pinmsgExtEdit.getText().toString()).setCallback(new RequestCallback<Long>() {
@Override
public void onSuccess(Long param) {
Toast.makeText(SessionExtension.this, "移除一条消息的PIN成功", Toast.LENGTH_SHORT).show();
showOnLog(logText, logJson.toString());
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
});
同步会话的PIN信息
java
InvocationFuture<MsgPinSyncResponseOptionWrapper> syncMsgPin(SessionTypeEnum sessionType, String sessionId, long timestamp);
参数 |
说明 |
sessionType |
会话类型 |
sessionId |
会话ID |
timestamp |
时间戳,同步时间戳以后的PIN |
javaNIMClient.getService(MsgService.class).syncMsgPin(getSessionType(), receiverEdit.getText().toString(), 0).setCallback(new RequestCallback<MsgPinSyncResponseOptionWrapper>() {
@Override
public void onSuccess(MsgPinSyncResponseOptionWrapper msgPinSync) {
if (msgPinSync == null) {
Toast.makeText(SessionExtension.this, "从服务端查询会话的PIN信息为空",
Toast.LENGTH_SHORT).show();
return;
}
if (!msgPinSync.isChanged()) {
Toast.makeText(SessionExtension.this, "没有变化", Toast.LENGTH_SHORT).show();
return;
}
ArrayList<IMMessage> msgList = new ArrayList<>();
for (MsgPinSyncResponseOption infoList : msgPinSync.getMsgPinInfoList()) {
String uuid = infoList.getKey().getUuid();
IMMessage msg = MsgDBHelper.queryMessageByUuid(uuid);
if (msg == null) {
continue;
}
msgList.add(msg);
}
MsgHistoryActivity.startActivity(SessionExtension.this, msgList);
}
@Overridetong
public void onFailed(int code) {
}
@Override
public void onException(Throwable exception) {
}
});
获取PIN消息列表
java
List<MsgPinDbOption> queryMsgPinBlock(String sessionId, SessionTypeEnum sessionType);
参数 |
说明 |
sessionId |
会话ID |
sessionType |
会话类型 |
javaList<MsgPinDbOption> msgPinDbOptions = NIMClient.getService(MsgService.class).queryMsgPinBlock(receiverEdit.getText().toString(), getSessionType());
会话置顶
云信提供会话置顶功能,支持多端同步,并且每个用户账号最多置顶 100 个会话。
添加一个置顶会话
java
InvocationFuture<StickTopSessionInfo> addStickTopSession(String sessionId, SessionTypeEnum sessionType, String ext);
参数 |
说明 |
sessionId |
会话ID |
sessionType |
会话类型 |
ext |
扩展字段,最大512字符 |
javaNIMClient.getService(MsgService.class).addStickTopSession(receiverEdit.getText().toString(), getSessionType(), extEdit.getText().toString()).setCallback(
new RequestCallback<StickTopSessionInfo>() {
@Override
public void onSuccess(StickTopSessionInfo param) {
Toast.makeText(SessionExtension.this, "添加一个置顶会话成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
}
);
删除一个置顶会话
java
InvocationFuture<Void> removeStickTopSession(String sessionId, SessionTypeEnum sessionType, String ext);
参数 |
说明 |
sessionId |
会话ID |
sessionType |
会话类型 |
ext |
扩展字段,最大512字符 |
javaNIMClient.getService(MsgService.class).removeStickTopSession(receiverEdit.getText().toString(), getSessionType(), extEdit.getText().toString()).setCallback(
new RequestCallback<Void>() {
@Override
public void onSuccess(Void param) {
Toast.makeText(SessionExtension.this, "删除一个置顶会话成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
}
);
更新扩展字段
java
InvocationFuture<StickTopSessionInfo> updateStickTopSession(String sessionId, SessionTypeEnum sessionType, String ext);
参数 |
说明 |
sessionId |
会话ID |
sessionType |
会话类型 |
ext |
扩展字段,最大512字符 |
javaNIMClient.getService(MsgService.class).updateStickTopSession(receiverEdit.getText().toString(), getSessionType(), extEdit.getText().toString()).setCallback(
new RequestCallback<StickTopSessionInfo>() {
@Override
public void onSuccess(StickTopSessionInfo param) {
Toast.makeText(SessionExtension.this, "更新一个会话在置顶上的扩展字段成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed(int code) {
Toast.makeText(SessionExtension.this, "失败:" + code, Toast.LENGTH_SHORT).show();
}
@Override
public void onException(Throwable exception) {
Log.e(TAG, "pull server message exception:" + exception);
}
}
);
获取置顶会话列表
注意:需要先设置初始化参数 SDKOptions 的 notifyStickTopSession 为 true,开启置顶会话列表的同步,方可通过以下接口查询到准确的置顶会话列表,否则查询到的列表不包含离线期间的改动。
java
List<StickTopSessionInfo> queryStickTopSessionBlock();
javaList<StickTopSessionInfo> sticktopsession = NIMClient.getService(MsgService.class).queryStickTopSessionBlock();