【问题标题】:Use smack#UserSearchManager cannot search user使用 smack#UserSearchManager 无法搜索用户
【发布时间】:2018-06-06 08:11:18
【问题描述】:

我尝试使用 Smack#UserSearchManager 搜索用户。但它总是返回空的 ReportedData。我确定我搜索的用户存在。所以我使用 spark 搜索同一个用户。它是真实存在的。 那是我的搜索代码。它在 smack 4.2.4 中使用。

DomainBareJid searchJID = JidCreate.domainBareFrom(Domainpart.from("search."+IMLib.getConn().getServiceName().asUnescapedString()));
UserSearchManager manager = new UserSearchManager(IMLib.getConn());
Form searchForm = manager.getSearchForm(searchJID);
Form answerForm = searchForm.createAnswerForm();
answerForm.setAnswer("Name", true);
answerForm.setAnswer("Username", true);
answerForm.setAnswer("Email", true);
answerForm.setAnswer("search", account);
ReportedData reportedData = manager.getSearchResults(answerForm, searchJID);
List<ReportedData.Row> rows = reportedData.getRows();

【问题讨论】:

    标签: openfire smack


    【解决方案1】:

    请考虑您的代码中的“帐户”必须是本地部分,例如 user1@domain/resource 中的“user1”。 我的代码正在运行:

        UserSearchManager sm = new UserSearchManager(connection);
        DomainBareJid sDomain = JidCreate.domainBareFrom("search." + connection.getServiceName());
        Form form = sm.getSearchForm(sDomain).createAnswerForm();
        form.setAnswer("Username", true);
        form.setAnswer("search", _user_name); // _user_name is "user1"
        ReportedData reportedData = sm.getSearchResults(form, sDomain);
    

    【讨论】:

      【解决方案2】:

      我的文笔不好。
      最后,我自己解决了我的问题。
      我看的是 UserSearch 节的内容。在 Spark 客户端中,使用 UserSearch iq 节,布尔类型的值是 1 或 0。但是当我们使用 smack 4.2.4 时,它是 true 或 false。
      结果,spark 可以搜索联系人,但搜索使用 smack 4.2.4 它不能这样做。顺便说一下,我没有尝试其他 smack 版本。我只知道 asmack 可以搜索联系人,以及 boolean 的值为 0 或 1。
      所以我根据节中的替换关键字值使用 StanzaInterceptor 来解决这个问题。
      这是解决方案。

      //register StanzaInterceptor
      IMLib.getConn().addStanzaInterceptor(new StanzaListener() {
              @Override
              public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {
                  if (packet instanceof UserSearch) {
                      List<ExtensionElement> list = packet.getExtensions();
                      if (list != null) {
                          for (ExtensionElement element : list) {
      
                              if (element.getNamespace().equals("jabber:x:data")) {
                                  packet.removeExtension(element);
                                  packet.addExtension(new FixedQueryXElement(element.toXML().toString()));
                              }
                          }
                      }
                  }
              }
          }, new StanzaTypeFilter(IQ.class));
      //the FixedQueryXElement class
      public class FixedQueryXElement implements ExtensionElement {
      
      private String mSource;
      
      private static final String REGEX = "(<field var='[\\w]{4,8}' type='boolean'><value>true</value></field>)";
      
      public FixedQueryXElement(String source) {
          this.mSource = source;
      }
      
      @Override
      public String getNamespace() {
          return "jabber:x:data";
      }
      
      @Override
      public String getElementName() {
          return "x";
      }
      
      @Override
      public CharSequence toXML() {
          Pattern pattern = Pattern.compile(REGEX);
          Matcher matcher = pattern.matcher(mSource);
          String des = mSource;
          while (matcher.find()) {
              String group = matcher.group();
              des = des.replace(group, group.replace("<value>true</value>", "<value>1</value>"));
          }
          return des;
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-19
        • 2018-07-18
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 2023-03-11
        相关资源
        最近更新 更多