跳到主要内容

@ 消息

提及(@)是群聊会话中常见功能,允许用户可以会话中提及指定用户,或全部群成员,以增强消息的提示作用。使用 @ 功能后,消息内容中会额外携带 MentionedInfo 对象。IMKit 默认启用了 @ 功能。

提示

IMKit 未实现 @所有人功能,图中「@所有人」仅作为设计参考。选择联系人页面的数据需要由应用程序提供,否则展示空列表。在使用 @ 功能前,请先实现群组成员提供者

局限

  • 仅支持群聊会话。
  • IMKit 默认仅实现了在发送文本消息、引用消息时使用 @ 功能。
  • IMKit 未实现 @ 所有人功能。
  • @ 消息可以被转发,但转发的只是纯文本,不再具备 @ 功能。

用法

提示

在使用 @ 功能前,请先实现群组成员提供者

IMKit 默认在配置中启用了 @ 功能,用法如下:

  • 在会话页面长按用户头像可触发消息编辑,提及(@)该用户。
  • 在会话页面输入 @ 符号之后,IMKit 会跳转到成员列表选择页面。如果应用程序未实现群组成员提供者(IGroupMembersProvider),该页面会显示一个空列表。实现群组成员提供者(IGroupMembersProvider)后,IMKit 会通过 IGroupMembersProvider 对象的 getGroupMembers 方法取得群成员数据,并展示在该列表页面中。

定制化

自定义选择成员界面

打开 @ 功能开关后,直接输入 @ 字符,会弹出成员列表页面(MentionMemberSelectActivity),您可以替换该页面。

  1. 调用 RongMentionManager 的方法设置监听器,监听 @ 字符输入。

    RongMentionManager.getInstance().setMentionedInputListener(new IMentionedInputListener() {
    /**
    * 设置监听
    * @param conversationType 会话类型. 群会话类型
    * @param targetId 会话 id. 群 ID
    */
    @Override
    public boolean onMentionedInput(Conversation.ConversationType conversationType, String targetId) {
    // 此处可跳转到您自定义的成员列表, 或进行其他操作.
    // 返回 true, 拦截事件
    return true;
    }
    });
  2. 在监听器的回调 onMentionedInput() 里跳转到自定义的 @ 成员选择界面,并返回 true

  3. 在自定义的成员选择界面中选择成员后,调用 mentionMember 方法返回所选成员信息 UserInfo

    如果返回 UserInfo,IMKit 编辑框中会按照 UserInfo 中的昵称显示被 @ 成员的名称。

    RongMentionManager.getInstance().mentionMember(userInfo);

    如果使用以下方法。IMKit 会通过 userId 从您实现的群成员用户信息提供者(UserDataProvider.GroupUserInfoProvider)中获取需要显示的用户昵称。

    String targetId = "群组 Id";
    String userId = "所 @ 的人的用户 ID";

    RongMentionManager.getInstance().mentionMember(ConversationType.GROUP, targetId, userId);

实现 @ 所有人

IMKit 未实现 @ 所有人功能的页面逻辑,您可以自行实现。

  1. 新建 MentionedInfo,设置 MentionedTypeMentionedType.ALL

    String targetId = "群组 Id";
    MentionedInfo mentionedInfo = new MentionedInfo(MentionedInfo.MentionedType.ALL, null, null);
  2. MentionedInfo 对象设置到 MessageContent 中。

    TextMessage messageContent = TextMessage.obtain(content);
    messageContent.setMentionedInfo(mentionedInfo);
    Message message = Message.obtain(targetId, ConversationType.GROUP, textMessage);
  3. 调用 IMKit 核心类 IMCenter 的方法发送消息。

    IMCenter.getInstance().sendMessage(message, null , null, new IRongCallback.ISendMessageCallback(){
    @Override
    public void onAttached(Message message) {

    }

    @Override
    public void onSuccess(Message message) {

    }

    @Override
    public void onError(Message message, RongIMClient.ErrorCode errorCode) {

    }
    });

关闭 @ 功能

IMKit 的 @ 功能默认开启。您可以通过修改全局配置关闭 @ 功能。

RongConfigCenter.conversationConfig().rc_enable_mentioned_message = false;

如果通过 XML 资源修改 IMKit 默认配置,可在应用 res/values 目录下创建 rc_config.xml 文件,添加以下配置:

<bool name="rc_enable_mentioned_message">false</bool>