当前知识库站点已不再维护。请移步新版知识库:https://help.rongcloud.cn/

如何在 IMLib 中实现正在输入的状态提示?

正在输入的状态提示 IMLib 实现方式
发布时间: 2016-01-25 15:20

回答:

您可以在用户正在输入的时候,向对方发送正在输入的状态。目前该功能只支持单聊。

1. 用户正在输入的时候,调用 RongIMClient.getInstance().sendTypingStatus(),向对方发送正在输入的状态。

/**
 * 向会话对方发送正在输入的状态.目前只支持单聊
 *
 * @param conversationType 会话类型
 * @param targetId         会话id
 * @param typingContentType 正在输入的消息的类型名
 * typingContentType为用户当前正在编辑的消息类型名,即message中getObjectName的返回值。
 * 如文本消息,应该传类型名"RC:TxtMsg"。
 * 
 */public void sendTypingStatus(Conversation.ConversationType conversationType, String targetId, String typingContentType)

其中,您可以在 typingContentType 中传入消息的类型名,会话中的其他用户输入状态监听中会收到此消息类型。您可以通过此消息类型,自定义不同的输入状态提示(如:正在输入、正在讲话、正在拍摄等)。

在 6 秒之内,如果同一个用户在同一个会话中多次调用此接口发送正在输入的状态,为保证产品体验和网络优化,将只有最开始的一次生效。


2. 在接收端,调用 RongIMClient.setTypingStatusListener() 设置输入状态监听器。

当前会话正在输入的用户有变化时,会触发监听中的 onTypingStatusChanged(),回调里携带有当前正在输入的用户列表和消息类型。当对方正在输入时,监听会触发一次;当对方不处于输入状态时,该监听还会触发一次,开发者需要在此时取消正在输入的显示。 单聊的时候,回调里的正在输入用户列表会为空,您可以直接获取会话的 targetId 作为正在输入的用户 ID。

RongIMClient.setTypingStatusListener(new RongIMClient.TypingStatusListener() {    @Override
    public void onTypingStatusChanged(Conversation.ConversationType type, String targetId, Collection<TypingStatus> typingStatusSet) {        //当输入状态的会话类型和targetID与当前会话一致时,才需要显示
        if (type.equals(mConversationType) && targetId.equals(mTargetId)) {            //count表示当前会话中正在输入的用户数量,目前只支持单聊,所以判断大于0就可以给予显示了
            int count = typingStatusSet.size();            if (count > 0) {
                Iterator iterator = typingStatusSet.iterator();
                TypingStatus status = (TypingStatus) iterator.next();
                String objectName = status.getTypingContentType();

                MessageTag textTag = TextMessage.class.getAnnotation(MessageTag.class);
                MessageTag voiceTag = VoiceMessage.class.getAnnotation(MessageTag.class);                //匹配对方正在输入的是文本消息还是语音消息
                if (objectName.equals(textTag.value())) {                    //显示“对方正在输入”
                    mHandler.sendEmptyMessage(SET_TEXT_TYPING_TITLE);
                } else if (objectName.equals(voiceTag.value())) {                    //显示"对方正在讲话"
                    mHandler.sendEmptyMessage(SET_VOICE_TYPING_TITLE);
                }
            } else {                //当前会话没有用户正在输入,标题栏仍显示原来标题
                mHandler.sendEmptyMessage(SET_TARGETID_TITLE);
            }
        }
    }
});