我正在使用Smack库开发一个IM应用程序,并且我面临一些问题。
我想知道是否可以通过服务器中的用户名来检查用户的存在。我的应用程序必须检查系统联系人列表中的人是否在我的服务器上打开了帐户,并且他们不在他们的朋友列表中。
到目前为止,我设法将系统联系人列表中的每个联系人添加到我的用户的服务器联系人列表中-即使他们事先没有帐户-但这不是我想要的。
下面是代码(Contact就像Smack的RosterEntry的包装类):public void addAllContactsIfExisting(Contact[] contactsAgenda) {
for (Contact contact: contactsAgenda) {
if (!isContactMyFriend(contact)) {
try {
// I'd like to check for account existence here, being contact.getJid() the username as it'd be in the server
conn.getRoster().createEntry(contact.getJid(), contact.getName(), null);
} catch (XMPPException e) {
e.printStackTrace();
}
}
}
}
如果它有帮助,我目前使用Openfire作为服务器
你可以使用UserSearch类来搜索一个特定的用户,如果用户没有在服务器上找到,那么你可以假设用户没有在服务器上注册。
您可以尝试下面的代码片段来搜索用户:
public Boolean checkIfUserExists(String user) throws XMPPException{
UserSearchManager search = new UserSearchManager(xmppConnection);
Form searchForm = search.getSearchForm("search."+xmppConnection.getServiceName());
Form answerForm = searchForm.createAnswerForm();
answerForm.setAnswer("Username", true);
answerForm.setAnswer("search", user);
ReportedData data = search.getSearchResults(answerForm,"search."+xmppConnection.getServiceName());
if (data.getRows() != null) {
Iterator<Row> it = data.getRows();
while (it.hasNext()) {
Row row = it.next();
Iterator iterator = row.getValues("jid");
if (iterator.hasNext()) {
String value = iterator.next().toString();
System.out.println("Iteartor values...... " + value);
}
}
return true;
}
return false;
}