使用 smack#UserSearchManager 无法搜索用户



我尝试使用Smack#UserSearchManager搜索用户.但它总是返回空的ReportsData.我确信我搜索的用户是什么 exists.so 我使用spark搜索相同的 user.it 是真实的存在。 这是我在 Smack 4.2.4 中使用的搜索 code.it。

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();

考虑代码中的"帐户"必须是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);

我的写作很糟糕。
最后,我自己解决我的问题。
我观察 UserSearch.In Spark 客户端的节的内容,使用 UserSearch iq 节,布尔类型的值为 1 或 0.但当我们使用 smack 4.2.4 时,它是真或假的。
结果,spark可以搜索联系人,但搜索使用smack 4.2.4,它不能做到这一点。顺便说一句,我没有尝试其他啪啪声版本。我只知道asmack可以搜索联系人,布尔值的值是0或1。
所以我使用节拦截器根据节中的替换关键字值来解决这个问题。
这是解决方案。

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

}

最新更新