消息正在输入
更新时间: 2024/11/21 17:47:19
网易云信即时通讯 NIM Android SDK 中的QChatMessageService
接口,提供sendTypingEvent
方法发送“正在输入事件”。接收方只有在监听该事件且订阅消息所在频道后,才能在消息输入方发送该事件后,接收到该事件。
前提条件
发送方和接收方都在频道内,即频道对两者都可见, 且发送方拥有发送频道消息权限(即QChatRoleResource
中的SEND_MSG
)。
实现流程
流程概览
下图可能因为网络问题而显示异常。如显示异常,一般尝试刷新当前页面即可正常显示。
sequenceDiagram
note over NIM SDK: 初始化 SDK 并登录 IM
par 注册监听并登录圈组
发送方 ->> NIM SDK: 登录圈组
接收方 ->> NIM SDK: 监听正在输入事件<br>(observeReceiveTypingEvent)
接收方 ->> NIM SDK: 登录圈组
end
note over NIM SDK: 双方加入同一服务器且<br>能访问同一频道
par 接收方订阅频道
接收方 ->> NIM SDK: 订阅频道<br>(subscribeChannel)
note over 接收方: 订阅类型设置为 CHANNEL_MSG_TYPING
end
note over NIM SDK: 发送方拥有发送消息的权限
par 消息收发
发送方 ->> NIM SDK: 发送正在输入事件<br>(sendTypingEvent)
note over 发送方: 发送方输入时调用
NIM SDK -->> 接收方: 正在输入事件(QChatTypingEvent)
end
流程说明
本节仅对上图中标为部分的流程进行说明,其他流程请参考相关文档。例如:
-
接收方调用
observeReceiveTypingEvent
方法监听正在输入事件(QChatTypingEvent
)。 -
接收方调用
subscribeChannel
方法,调用时将入参QChatSubscribeType
设为CHANNEL_MSG_TYPING
,实现对正在输入事件的订阅。如果断线重连,SDK 会自动再次订阅正在输入事件。但如果用户调用
logout
方法切断与圈组服务端的连接或销毁 SDK 实例后重建实例,那么用户需要再度调subscribeChannel
方法重新订阅该事件。 -
发送方调用
sendTypingEvent
方法发送正在输入事件。发送该事件后,SDK 会触发用户A 在
observeReceiveTypingEvent
方法中设置的回调,将QChatTypingEvent
投递至用户A。该方法有调用频率上限,目前默认 3,000 ms 一次。
示例代码
//************************接收方设置正在输入事件监听回调************************/
NIMClient.getService(QChatServiceObserver.class).observeReceiveTypingEvent(new Observer<QChatTypingEvent>() {
@Override
public void onEvent(QChatTypingEvent qChatTypingEvent) {
//收到正在输入事件
}
},true);
//************************接收方订阅某正在输入事件************************/
//服务器Id
long serviceId = 2114708;
//频道Id
long channelId = 233479;
List<QChatChannelIdInfo> channelIdInfos = new ArrayList<>();
channelIdInfos.add(new QChatChannelIdInfo(serviceId,channelId));
QChatSubscribeChannelParam subscribeChannelParam = new QChatSubscribeChannelParam(QChatSubscribeType.CHANNEL_MSG_TYPING,
QChatSubscribeOperateType.SUB,channelIdInfos);
NIMClient.getService(QChatChannelService.class).subscribeChannel(subscribeChannelParam).setCallback(
new RequestCallback<QChatSubscribeChannelResult>() {
@Override
public void onSuccess(QChatSubscribeChannelResult result) {
//订阅正在输入事件为空,正在输入事件订阅成功后不会返回未读信息,result.getUnreadInfoList()中的数据为空
}
@Override
public void onFailed(int code) {
}
@Override
public void onException(Throwable exception) {
}
});
//************************发送方发送正在输入事件************************/
QChatSendTypingEventParam sendTypingEventParam = new QChatSendTypingEventParam(serviceId,channelId);
//可以设置自定义扩展字段
Map<String, Object> extension = new HashMap<>();
extension.put("test","extension info");
sendTypingEventParam.setExtension(extension);
NIMClient.getService(QChatMessageService.class).sendTypingEvent(sendTypingEventParam).setCallback(
new RequestCallback<QChatSendTypingEventResult>() {
@Override
public void onSuccess(QChatSendTypingEventResult result) {
//发送成功,返回发送成功的正在输入事件
QChatTypingEvent typingEvent = result.getTypingEvent();
}
@Override
public void onFailed(int code) {
}
@Override
public void onException(Throwable exception) {
}
});
此文档是否对你有帮助?