使用smack#UserSearchManager无法搜索用户

时间:2018-06-06 08:11:19

标签: openfire smack

我尝试使用Smack#UserSearchManager来搜索用户。但它总是返回空的ReportedData.i我确定用户我搜索的是什么存在。所以我使用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();

2 个答案:

答案 0 :(得分:0)

在您的代码中考虑“account”必须是localpart,例如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);

答案 1 :(得分:0)

我的写作不好。
最后,我自己解决问题。
我看到了节的内容,即UserSearch。在Spark客户端中,使用UserSearch iq节,布尔类型的值是1或0。但是,当我们使用smack 4.2.4时,它是true还是false。 > 结果,spark可以搜索联系人,但是搜索使用smack 4.2.4不能做到这一点。顺便说一下,我没有尝试其他smack版本。我只知道asmack可以搜索联系人,并且boolean的值是0或1。
因此,我根据节中的replace关键字值使用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;
}

}