使用 smack#UserSearchManager 无法搜索用户
Use smack#UserSearchManager cannot search user
我尝试使用 Smack#UserSearchManager 来搜索用户。但它始终是 return 空的 ReportedData.i 我确定用户是我搜索的内容 exists.so 我使用 spark 来搜索相同的内容user.it是真实的存在。
这是我的搜索 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();
请考虑您的代码中的 "account" 必须是本地部分,例如 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.But 是真还是假,当我们使用 smack 4.2.4 .
因此,spark 可以搜索联系人,但搜索使用 smack 4.2.4 它不能 that.By 的方式,我没有尝试其他 smack version.I 只知道 asmack 可以搜索联系人,并且布尔值是 0 或 1。
所以我根据节中的替换关键字值使用 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;
}
}
我尝试使用 Smack#UserSearchManager 来搜索用户。但它始终是 return 空的 ReportedData.i 我确定用户是我搜索的内容 exists.so 我使用 spark 来搜索相同的内容user.it是真实的存在。 这是我的搜索 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();
请考虑您的代码中的 "account" 必须是本地部分,例如 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.But 是真还是假,当我们使用 smack 4.2.4 .
因此,spark 可以搜索联系人,但搜索使用 smack 4.2.4 它不能 that.By 的方式,我没有尝试其他 smack version.I 只知道 asmack 可以搜索联系人,并且布尔值是 0 或 1。
所以我根据节中的替换关键字值使用 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;
}
}