有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

功能展示

其功能效果可参见 Android SDK Tuikit

对接指引

步骤1:购买套餐包

请将套餐升级到旗舰版,请参见 购买指引

步骤2:调用搜索本地用户资料接口

调用接口 searchFriends 可以搜索本地用户资料,其中的接口参数 searchParams 支持搜索nickName、userID、remark字段。可以使用此接口实现好友搜索功能,如昵称搜索等。

 V2TimFriendSearchParam searchParam = new V2TimFriendSearchParam(
        keywordList: ["你的关键字"],
        isSearchUserID: true,  // 搜索中是否包括userId
        isSearchNickName: true, // 搜索中是否包括nickName
        isSearchRemark: true); // 搜索中是否包括remark
    var res = await TencentImSDKPlugin.v2TIMManager
        .getFriendshipManager()
        .searchFriends(searchParam: searchParam);

步骤3:调用搜索本地群组和群成员接口

调用接口 searchGroups 可以搜索本地群组资料。
调用接口 searchGroupMembers 可以搜索本地群成员资料,根据 V2TimGroupMemberSearchParam 中的 groupIDList 是否为 null,分为两种情况:

  • 如果设置 groupIDList == null,代表搜索全部群中的群成员,返回的结果会按照 groupID 进行分类;
  • 如果设置 groupIDList != null,代表搜索指定群中的群成员。

步骤4:调用搜索本地消息接口

在搜索框输入关键字可以调用 searchLocalMessages 搜索本地消息。根据搜索参数 V2TIMMessageSearchParam 中的 conversationID 是否为 null,分为两种情况:

  • 如果设置 conversationID == null,代表搜索全部会话,返回的结果会按照消息所属的会话进行分类。
  • 如果设置 conversationID != null,代表搜索指定会话。

展示最近几个活跃的会话
搜索到的消息所属的最近会话列表,实现方式如下:

  • 搜索参数 V2TimMessageSearchParam 中的 conversationID 设置为 null 表示搜索所有会话的消息,pageIndex 设置为0表示搜索到的消息所属的会话的第0页数据,pageSize 则表示返回最近的会话数量。
  • 在搜索回调结果 V2TimMessageSearchResult 表示匹配到的消息所属的所有会话数量;messageSearchResultItems 为最近 pageSize 个会话信息。其中 V2TimMessageSearchResultItem 表示会话 ID;messageCount 表示当前会话搜索到的消息总数量;messageList 在进行全部会话搜索时则有两种表现:
    • 如果搜索到的消息条数 > 1,则 messageList 为空,您可以在 UI 上显示“messageCount 条相关聊天记录”;
    • 如果搜索到的消息条数 = 1,则 messageList 为匹配到的那条消息,您可以在 UI 上显示消息内容并高亮搜索关键词例如图中的“test”。
      messageList 在进行特定会话搜索时则会表搜索到本会话中所有满足搜索条件的消息列表。

示例

    V2TimMessageSearchParam searchParam = V2TimMessageSearchParam(
      keywordList: [keyword],
      type:1, // 对应 V2TIMKeywordListMatchType.KEYWORD_LIST_MATCH_TYPE_AND sdk层处理  代表 或 与关系
      pageSize: 50, 
      pageIndex: 0, 
      conversationID: null, // 不传代表指定所有会话
    );
    V2TimValueCallback<V2TimMessageSearchResult> res = await TencentImSDKPlugin.v2TIMManager
        .getMessageManager()
        .searchLocalMessages(searchParam: searchParam);

展示所有搜索到的消息所属的会话列表

例如单击图1中的“更多聊天记录”跳转到图2来展示所有搜索到的消息所属的会话列表,其中的搜索参数和搜索结果描述跟上面的场景类似。为了防止内存膨胀,强烈建议对会话列表分页加载。例如您希望每页展示10条会话结果,搜索参数 V2TIMMessageSearchParam 可以参见如下设置:

  • 首次调用:设置参数 pageSize = 10,pageIndex = 0,调用 searchLocalMessages 从结果回调中的 totalCount 可以获取会话总数量;
  • 计算页数:totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize + 1) 。
  • 再次调用:可以通过指定参数 pageIndex(pageIndex < totalPage)返回后续页号的结果

示例

......
static int totalCount = 0;
int index = 0;
// 每页展示数量为10条,计算总页数
 double totalPage = (totalCount % 10 == 0) ? (totalCount / 10) : (totalCount / 10 + 1);
......
    searchLocaltMessage(int index) async {
    if (index >= totalPage) {
      return;
    }

    V2TimMessageSearchParam searchParam = V2TimMessageSearchParam(
      keywordList: ["你的keyword"],
      type:
          1, // 对应 V2TIMKeywordListMatchType.KEYWORD_LIST_MATCH_TYPE_AND sdk层处理  代表 或 与关系
      pageSize: 10,
      pageIndex: index,
      conversationID: null, // 不传代表指定所有会话
    );
    V2TimValueCallback<V2TimMessageSearchResult> res = await TencentImSDKPlugin
        .v2TIMManager
        .getMessageManager()
        .searchLocalMessages(searchParam: searchParam);
    // 该会话匹配到的所有消息数量
    totalCount = res.data?.totalCount ?? 0;
    List<V2TimMessageSearchResultItem> list =
        res.data!.messageSearchResultItems!;
    totalPage =
        (totalCount % 10 == 0) ? (totalCount / 10) : (totalCount / 10 + 1);
    for (V2TimMessageSearchResultItem resultItem in list) {
      // 会话 ID
      String conversationID = resultItem.conversationID!;
      // 该会话匹配到的所有消息数量
      int totalMessageCount = resultItem.messageCount!;
      // 消息列表:如果 totalMessageCount > 1,该列表为空;如果 totalMessageCount = 1,该列表元素为此消息
      List<V2TimMessage> v2TIMMessageList = resultItem.messageList!;
      // ...
    }
  }

  void loadMore() {
    index = index++;
    searchLocaltMessage(index);
  }

搜索指定会话中的消息
现在我们来介绍如何搜索指定会话中的消息。为了防止内存膨胀,强烈建议对消息列表分页加载。实现方式如下:

示例

......
static int totalCount = 0;
int index = 0;
// 每页展示数量为10条,计算总页数
 double totalPage = (totalCount % 10 == 0) ? (totalCount / 10) : (totalCount / 10 + 1);
......
    searchLocaltMessage(int index) async {
    if (index >= totalPage) {
      return;
    }

    V2TimMessageSearchParam searchParam = V2TimMessageSearchParam(
      keywordList: ["你的keyword"],
      type:
          1, // 对应 V2TIMKeywordListMatchType.KEYWORD_LIST_MATCH_TYPE_AND sdk层处理  代表 或 与关系
      pageSize: 10,
      pageIndex: index,
      conversationID: "传入你要搜索的conversationID", // 指定conversationID
    );
    V2TimValueCallback<V2TimMessageSearchResult> res = await TencentImSDKPlugin
        .v2TIMManager
        .getMessageManager()
        .searchLocalMessages(searchParam: searchParam);
    // 该会话匹配到的所有消息数量
    totalCount = res.data?.totalCount ?? 0;
    List<V2TimMessageSearchResultItem> list =
        res.data!.messageSearchResultItems!;
    totalPage =
        (totalCount % 10 == 0) ? (totalCount / 10) : (totalCount / 10 + 1);
    for (V2TimMessageSearchResultItem resultItem in list) {
      // 会话 ID
      String conversationID = resultItem.conversationID!;
      // 该会话匹配到的所有消息数量
      int totalMessageCount = resultItem.messageCount!;
      // 消息列表:如果 totalMessageCount > 1,该列表为空;如果 totalMessageCount = 1,该列表元素为此消息
      List<V2TimMessage> v2TIMMessageList = resultItem.messageList!;
      // ...
    }
  }

  void loadMore() {
    index = index++;
    searchLocaltMessage(index);
  }

常见问题

1. 如何搜索自定义消息

需要使用接口 createCustomMessage({required String data,String desc,String extension}) 来创建并发送,把需要搜索的文本放到 desc 参数中。而使用接口 createCustomMessage (required String data) 创建的自定义消息由于本地保存的是参数传的二进制数据流,因此无法被搜索到。
如果您配置了离线推送功能,参数 description 设置后,自定义消息也会有离线推送且通知栏展示该参数内容。如果不需要离线推送可以用发消息接口 sendMessage 的参数 V2TIMOfflinePushInfo 中的 disablePush 来控制;如果推送的通知栏内容不想展示为被搜索的文本,可以用参数 V2TIMOfflinePushInfo 中的 desc 来另外设置推送内容。

2. 如何搜索富媒体消息

富媒体消息包含文件、图片、语音、视频消息。
对于文件消息,界面通常显示文件名,因此创建时可以设置 fileName 参数,作为被搜索的内容,如果 fileName 不设置则会从 filePath 提取文件名,并且都会保存到本地和服务器,需要注意的是在 Web 无法搜索文件,而对于图片、语音、视频消息,界面通常显示缩略图或时长,可以指定消息类型做分类搜索,但不能通过关键字搜索。