我尝试使用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();
答案 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;
}
}