环境:
- Ejabberd版本:16.04
- 的Smack-机器人-4.1.0
我正在尝试创建一个聊天应用程序,它具有按名称,年龄等搜索可用用户的功能。但是,当我使用下面的代码时,服务器在服务器中没有任何搜索服务
public void serachServiceList() {
try {
UserSearchManager searchManager = new UserSearchManager(connection);
List<String> services = searchManager.getSearchServices();
if (services == null || services.size() < 1) {
System.out.println("No services");
} else {
for (String service : services) {
Log.e("SERVICE", service);
}
}
} catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
XMPP服务器中是否有默认搜索服务?我是否必须单独安装搜索服务?我搜索但我找不到任何搜索插件为smack。 很高兴听到您的解决方案/想法。 提前谢谢。
答案 0 :(得分:1)
我也开发了相同的功能,但我使用VCard来搜索用户而不是SearchManager。
首先需要添加all contact in roster并使用vcard,您可以获取或设置用户头像,设置用户状态,存储用户状态,如whatsapp等,使用JID搜索用户等< / p>
以下是来自Vcard的代码搜索用户
搜索用户():
public UserProfile search(String jid) throws SmackInvocationException {
if (vCardHelper == null) {
return null;
}
VCard vCard = vCardHelper.loadVCard(jid);
String nickname = vCard.getNickName();
return nickname == null ? null : new UserProfile(jid, vCard);
}
UserProfile是一个模型类,其中包含以下带有garter setter
的值
private String nickname;
private String jid;
private String status;
private byte[] avatar;
<强> getNickName():强>
public String getNickname(String jid) throws SmackInvocationException {
VCard vCard = vCardHelper.loadVCard(jid);
return vCard.getNickName();
}
<强> loadVCard():强>
public VCard loadVCard(String jid) throws SmackInvocationException {
VCard vCard = new VCard();
try {
vCard.load(con, jid);
return vCard;
} catch (Exception e) {
throw new SmackInvocationException(e);
}
}
以下代码从服务器获取搜索用户的列表
- 我在这里看到了一个简单的例子,我创建了
AsyncTask
这个 任务放在doInBackground
try {
UserProfile user = SmackHelper.getInstance(context).search(username);
if (user != null) {
if (user.getUserName().equals(PreferenceUtils.getUser(context))) {
user.setType(UserProfile.TYPE_MYSELF);
} else {
Cursor c = context.getContentResolver().query(ContactTable.CONTENT_URI, new String[]{ContactTable._ID},
ContactTable.COLUMN_NAME_JID + " = ?", new String[] {user.getJid()}, null);
if (c.moveToFirst()) {
user.setType(UserProfile.TYPE_CONTACT);
} else {
user.setType(UserProfile.TYPE_NOT_CONTACT);
}
}
}
return Response.success(user);
} catch(SmackInvocationException e) {
Log.e(String.format("search user error %s", e.toString()), e);
return Response.error(e);
}