使用 smack#UserSearchManager 无法搜索用户

Use smack#UserSearchManager cannot search user

我尝试使用 Smack#UserSearchManager 来搜索用户。但它始终是 return 空的 ReportedData.i 我确定用户是我搜索的内容 exists.so 我使用 spark 来搜索相同的内容user.it是真实的存在。 这是我的搜索 code.it 在 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();

请考虑您的代码中的 "account" 必须是本地部分,例如 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);

我的文笔不好
最后,我自己解决了我的问题。
我看节的内容是 UserSearch.In Spark 客户端,使用 UserSearch iq 节,布尔类型的值为 1 或 0.But 是真还是假,当我们使用 smack 4.2.4 .
因此,spark 可以搜索联系人,但搜索使用 smack 4.2.4 它不能 that.By 的方式,我没有尝试其他 smack version.I 只知道 asmack 可以搜索联系人,并且布尔值是 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;
}

}