您的位置:首页 > 移动开发 > Android开发

Android xmpp查询用户(模糊查询)

2019-09-24 10:12 106 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u014714188/article/details/101267847

Android xmpp查询用户(模糊查询)

此处以smack:4.3.4版本为例,介绍直接根据用户名通过xmpp模糊查询用户。

我们先来看看查询的效果

查询的方法实现

本例用的smack:4.3.4版本,getSearchForm和getSearchResults方法传的是DomainBareJid类型,而之前的版本是String类型,大家在使用的时候需要特别注意,而转换DomainBareJid的方式如下面的例子所示:JidCreate.domainBareFrom(“search.” + getConnection().getXMPPServiceDomain())。

/**
* 查询用户
*
* @param userName userName
* @return List<HashMap < String, String>>
*/
public List<UserInfo> searchUsers(String userName) {
if (getConnection() == null) {
return null;
}
UserInfo user;  //自定义的用户实体类
List<UserInfo> userInfos = new ArrayList<>();
try {
UserSearchManager usm = new UserSearchManager(getConnection());
//本例用的smack:4.3.4版本,getSearchForm方法传的是DomainBareJid类型,而之前的版本是String类型,大家在使用的时候需要特别注意
//而转换DomainBareJid的方式如下面的例子所示:JidCreate.domainBareFrom("search." + getConnection().getXMPPServiceDomain())
Form searchForm = usm.getSearchForm(JidCreate.domainBareFrom("search." + getConnection().getXMPPServiceDomain()));
if (searchForm == null) {
return null;
}
//这里设置了Username为true代码是根据用户名查询用户,search代表查询字段
//smack:4.3.4版本是下面的字段,但之前的版本会有些不一样,所以在用的时候最好看下xmpp交互的log,里面有相应的字段值
Form answerForm = searchForm.createAnswerForm();
answerForm.setAnswer("Username", true);
answerForm.setAnswer("search", userName);
ReportedData data = usm.getSearchResults(answerForm, JidCreate.domainBareFrom("search." + getConnection().getXMPPServiceDomain()));
List<ReportedData.Row> rowList = data.getRows();

//此处返回的字段名如下所示,之前的版本可能有所变化,使用的时候需要注意
for (ReportedData.Row row : rowList) {
user = new UserInfo();
String jid = row.getValues("jid").toString();
String username = row.getValues("Username").toString();
String name = row.getValues("Name").toString();
String email = row.getValues("Email").toString();
user.setJid(jid.substring(jid.indexOf("[")+1,jid.indexOf("]")));
user.setUserName(username.substring(username.indexOf("[")+1,username.indexOf("]")));
user.setNickName(name.substring(name.indexOf("[")+1,name.indexOf("]")));
user.setEmail(email.substring(email.indexOf("[")+1,email.indexOf("]")));
userInfos.add(user);
// 若存在,则有返回,UserName一定非空,其他两个若是有设,一定非空
}
} catch (SmackException | InterruptedException | XmppStringprepException | XMPPException e) {
e.printStackTrace();
}
return userInfos;
}

最后需要特别注意

如果用上面的方法还是查不到数据,并且看log,xmpp之间的交互也没有报任何错误,那就需要看看你自己安装配置的openfire的search插件是否有安装。如下图所示。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: