Android

聊天扩展

更新时间: 2024/06/19 14:26:06

消息回复

NIM SDK 提供会话消息回复(Thread)功能,可引用接收到的某一条消息进行针对性的回复,形成起始于该消息的消息回复树状结构。通过该功能,用户可针对某一条消息进行提问、反馈或补充相关背景信息,且不会对频道内的会话流造成干扰。

Thread 指以一条消息作为根消息的消息回复树状结构,示例见下图。

Thread消息.png

上图中:

  • 消息 A 是消息 B 的父消息,消息 B1 是消息 C 的父消息
  • 消息 C 是消息 B1 的子消息
  • 消息 A 是消息 B 和消息 C 的根消息
  • 消息 A、B、C 统称为 Threaded Message(串联起来的消息)
  • 一条 Threaded Message 必须有一条父消息或至少一条子消息。如果一条消息既没有父消息,也没有子消息,则为普通消息。
  • 若未开通回复功能,回复时系统会自动将所发消息转换为一条普通消息。若需要 thread 回复能力,请至云信控制台应用管理 > 产品功能 > IM 即时通讯 > 全局功能开通会话消息回复

消息回复

  • API原型
java/**
 * 回复消息。<br>
 * 如果需要更新发送进度,请调用{@link MsgServiceObserve#observeMsgStatus(com.netease.nimlib.sdk.Observer, boolean)}
 *
 * @param msg    带发送的消息体,由{@link MessageBuilder}构造
 * @param replyMsg 被回复的消息
 * @param resend 如果是发送失败后重发,标记为true,否则填false
 * @return InvocationFuture 可以设置回调函数。消息发送完成后才会调用,如果出错,会有具体的错误代码。
 */
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) {
                  //回复消息失败,code为错误码
                }

                @Override
                public void onException(Throwable exception) {
                  //回复消息产生异常
                }
            })

注意:在超大群中,回复消息应使用 SuperTeamService

查询thread聊天云端历史

  • API原型
java/**
 * 查询thread聊天云端历史(支持p2p、群、超大群)
 *
 * @param anchor 查找锚点,查找对象为此消息所在的 thread 会话中的消息
 * @param fromTime 起始时间
 * @param toTime 终止时间
 * @param limit 条数限制
 * @param direction 方向
 * @param persist 是否持久化
 * @return InvocationFuture
 */
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消息的回复消息的条数。

  • API原型
java/**
 * 本地获取某thread消息的回复消息的条数,thread消息不被计入总数
 *
 * @param msg thread中的某一条消息
 * @return 回复消息数
 */
int queryReplyCountInThreadTalkBlock(IMMessage msg);
  • 参数说明
参数 说明
msg thread中的某一条消息
  • 示例
javaint count = NIMClient.getService(MsgService.class).queryReplyCountInThreadTalkBlock(replymessage.get(0));

快捷评论

可以对消息进行快捷评论。评论内容并非一条消息,而是一个long类型,由上层指定评论内容与界面展示之间的联系。单应用支持最多 500 条快捷评论。

增加评论

  • API 原型
java/**
 * 增加一条快捷评论
 *
 * @param msg 回复对象
 * @param replyType 回复类型,最小值为整数1
 * @param ext 自定义扩展字段,最大8字符
 * @param needPush 是否需要推送
 * @param needBadge 是否需要角标
 * @param pushTitle 推送标题
 * @param pushContent 推送内容
 * @param pushPayload 第三方自定义的推送属性,限制json类型
 * @return InvocationFuture
 */
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);
    }
});

删除评论

  • API原型
java/**
 * 删除一条快捷评论
 *
 * @param msg 回复对象
 * @param replyType 回复类型,最小值为整数1
 * @param ext 自定义扩展字段,最大8字符
 * @param needPush 是否需要推送
 * @param needBadge 是否需要角标
 * @param pushTitle 推送标题
 * @param pushContent 推送内容
 * @param pushPayload 第三方自定义的推送属性,限制json类型
 * @return InvocationFuture
 */
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);
    }
});

获取评论

  • API原型
java/**
 * 获取快捷评论列表
 *
 * @param msgList 每个元素是被查询快捷评论的消息,数量不超过20
 * @return InvocationFuture
 */
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 个收藏。

添加一条收藏

  • API原型
java/**
 * 添加一条收藏
 *
 * @param type 收藏类型
 * @param date 收藏内容,最大20k
 * @param ext 扩展字段,最大1k
 * @param uniqueId 去重唯一ID
 * @return InvocationFuture
 */
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);
            }
        }
);

批量移除收藏

  • API原型
java/**
 * 批量移除收藏
 *
 * @param collectInfo 要移除的收藏的关键信息组成的列表,每一项为一个Pair,其中第一项为收藏的ID,第二项为收藏的创建时间
 * @see CollectInfo
 * @return InvocationFuture
 */
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);
            }
        }
);

更新收藏的扩展字段

  • API原型
java/**
 * 更新一个收藏的扩展字段
 *
 * @param infoId 要更新的收藏的ID
 * @param createTime 要更新的收藏的创建时间
 * @param ext 更新后的扩展字段
 * @return InvocationFuture
 */
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);
    }
});

分页查询收藏列表

  • API原型
java/**
 * 从服务端分页查询收藏列表
 *
 * @param anchor 结束查询的最后一条收藏(不包含在查询结果中)
 * @param toTime 结束时间点单位毫秒
 * @param limit 本次查询的消息条数上限(最多100条)
 * @param direction 查询方向
 * @return InvocationFuture
 */
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一条消息

  • API原型
java/**
 * PIN一条消息
 *
 * @param msg 被PIN的消息
 * @param ext 扩展字段
 * @return InvocationFuture
 */
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

  • API原型
java/**
 * 更新一条消息的PIN
 *
 * @param msg 被PIN的消息
 * @param ext 扩展字段
 * @return InvocationFuture
 */
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

  • API原型
java/**
 * 移除一条消息的PIN
 *
 * @param msg 被PIN的消息
 * @param ext 扩展字段
 * @return InvocationFuture
 */
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信息

  • API原型
java/**
 * 同步会话的PIN信息
 *
 * @param sessionType 会话类型
 * @param sessionId   会话ID
 * @param timestamp   时间戳,同步时间戳以后的PIN
 * @return InvocationFuture
 */
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消息列表

  • API原型
java/**
 * 本地获取会话的PIN消息列表
 *
 * @param sessionId 会话ID
 * @param sessionType 会话类型
 * @return PIN消息列表
 */
List<MsgPinDbOption> queryMsgPinBlock(String sessionId, SessionTypeEnum sessionType);
  • 参数说明
参数 说明
sessionId 会话ID
sessionType 会话类型
  • 示例
javaList<MsgPinDbOption> msgPinDbOptions = NIMClient.getService(MsgService.class).queryMsgPinBlock(receiverEdit.getText().toString(), getSessionType());

会话置顶

云信提供会话置顶功能,支持多端同步,并且每个用户账号最多置顶 100 个会话。

添加一个置顶会话

  • API原型
java/**
 * 添加一个置顶会话
 *
 * @param sessionId   会话ID
 * @param sessionType 会话类型
 * @param ext         扩展字段,最大512字符
 * @return InvocationFuture
 */
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);
            }
        }
);

删除一个置顶会话

  • API原型
java/**
 * 删除一个置顶会话
 *
 * @param sessionId   会话ID
 * @param sessionType 会话类型
 * @param ext         扩展字段,最大512字符
 * @return InvocationFuture
 */
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);
            }
        }
);

更新扩展字段

  • API原型
java/**
 * 更新一个会话在置顶上的扩展字段
 *
 * @param sessionId   会话ID
 * @param sessionType 会话类型
 * @param ext         扩展字段,最大512字符
 * @return InvocationFuture
 */
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,开启置顶会话列表的同步,方可通过以下接口查询到准确的置顶会话列表,否则查询到的列表不包含离线期间的改动。

  • API原型
java/**
 * 获取置顶会话信息的列表
 *
 * @return 置顶信息列表
 */
List<StickTopSessionInfo> queryStickTopSessionBlock();
  • 示例
javaList<StickTopSessionInfo> sticktopsession = NIMClient.getService(MsgService.class).queryStickTopSessionBlock();
此文档是否对你有帮助?
有帮助
去反馈
  • 消息回复
  • 消息回复
  • 查询thread聊天云端历史
  • 获取thread消息回复数
  • 快捷评论
  • 增加评论
  • 删除评论
  • 获取评论
  • 收藏夹
  • 添加一条收藏
  • 批量移除收藏
  • 更新收藏的扩展字段
  • 分页查询收藏列表
  • PIN标记
  • PIN一条消息
  • 更新一条消息的PIN
  • 移除一条消息的PIN
  • 同步会话的PIN信息
  • 获取PIN消息列表
  • 会话置顶
  • 添加一个置顶会话
  • 删除一个置顶会话
  • 更新扩展字段
  • 获取置顶会话列表