Используйте smack # UserSearchManager не может найти пользователя - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь использовать Smack # UserSearchManager для поиска пользователя. Но он всегда возвращал пустое ReportedData. Я уверен, что пользователь, которого я ищу, существует. Поэтому я использую искру для поиска того же пользователя. Это было реальное существование.это мой поиск 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();

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Мое письмо плохое.
Наконец, я решаю свой вопрос самостоятельно.
Я смотрю содержимое раздела, в котором был UserSearch. В Spark-клиенте используйте UserSearch iq stanza, значение логического типа.было 1 или 0. Но это было истина или ложь, когда мы используем smack 4.2.4.
В результате, spark может искать контакты, но поиск использует smack 4.2.4, но не может этого сделать. Кстати,я не пробую другую версию smack. Я просто знаю, что asmack может искать контакты, и значение boolean было 0 или 1.
Поэтому я использую StanzaInterceptor для решения этой проблемы в соответствии со значением ключевого слова replace в разделе.
Вот решение.

//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;
}

}

0 голосов
/ 19 июня 2018

Считайте, что «account» в вашем коде должен быть localpart, как «user1» в user1 @ domain / resource.Мой код работает:

    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...