环境:
- ejabberd版本:16.04
- smack android-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的任何搜索插件。很高兴听到您的解决方案/想法。预先感谢。
我也开发了相同的功能,但我使用vcard将serach用户而不是搜索manager。
首先,需要在名册中添加所有联系人,并使用VCARD可以获取或设置用户avatar,获取设置用户在线,存储用户状态,例如WhatsApp等,使用JID et et
这是我的代码搜索用户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);
}
用户程序是一个模型类,其中包含以下值的吊袜带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);
}