Мое письмо плохое.
Наконец, я решаю свой вопрос самостоятельно.
Я смотрю содержимое раздела, в котором был 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;
}
}