Я начал разрабатывать чат-приложение. Мне нужно было проверить, что пользователь зарегистрировался или нет на сервере xmpp. Поэтому, когда пользователь пытается зарегистрироваться, я хочу проверить, что пользователь уже зарегистрирован или нет на сервере xmpp. После того, как сервер XMPP подключен успешно, Пробовал искать, как число, используя Usersearchmanager.But Getting ошибку какКак использовать UserSearchManager для проверки того, что пользователь зарегистрирован или нет в xmpp?
java.lang.IllegalArgumentException: Must have a local(user) JID set.Either you didn 't configure one or you where not connected at least once
at org.jivesoftware.smack.filter.IQReplyFilter. <init> (IQReplyFilter.java: 94)
at org.jivesoftware.smack.AbstractXMPPConnection.createPacketCollectorAndSend(AbstractXMPPConnection.java: 699)
at org.jivesoftware.smackx.search.UserSearch.getSearchForm(UserSearch.java: 73)
at org.jivesoftware.smackx.search.UserSearchManager.getSearchForm(UserSearchManager.java: 71)
at com.techno.samplechat.Myxmpp.searchUsers(Myxmpp.java: 335)
at com.techno.samplechat.Myxmpp$XMPPConnectionListener.connected(Myxmpp.java: 284)
at org.jivesoftware.smack.AbstractXMPPConnection.callConnectionConnectedListener(AbstractXMPPConnection.java: 1162)
at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection.java: 850)
at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.java: 365)
at com.techno.samplechat.Myxmpp$1.run(Myxmpp.java: 117)
at java.lang.Thread.run(Thread.java: 818)
Код:
private void CreateAccount() {
org.jivesoftware.smackx.iqregister.AccountManager am = org.jivesoftware.smackx.iqregister.AccountManager
.getInstance(connection);
am.sensitiveOperationOverInsecureConnection(true);
Map < String, String > attributes = new HashMap < String, String >();
attributes.put("username", loginUser);
attributes.put("email", "[email protected]");
attributes.put("password", passwordUser);
attributes.put("name", UserName);
try {
if (am.supportsAccountCreation()) {
am.createAccount(
loginUser,
passwordUser,
attributes);
login();
}
} catch (SmackException.NoResponseException e) {
e.printStackTrace();
} catch (XMPPException.XMPPErrorException e) {
e.printStackTrace();
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
private void login() {
try {
connection.login(loginUser, passwordUser);
Log.i("LOGIN", "Yey! We're connected to the Xmpp server!");
} catch (XMPPException e) {
e.printStackTrace();
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
ChatManager.getInstanceFor(connection).addChatListener(this);
}
@
Override
public void chatCreated(Chat chat, boolean createdLocally) {
Log.i("service", "chatCreated()");
System.out.println("+chatList++" + chat.getParticipant());
chat.addMessageListener(this);
}
@
Override
public void entriesAdded(Collection <String> addresses) {
}
@
Override
public void entriesUpdated(Collection <String> addresses) {
}
@
Override
public void entriesDeleted(Collection <String> addresses) {
}
@
Override
public void presenceChanged(Presence presence) {
}
@
Override
public void processMessage(Chat chat, Message message) {
if (message.getType() == Message.Type.chat || message.getType() == Message.Type.normal) {
if (message.getBody() != null) {
// Toast.makeText(this,message.getFrom() + " : " + message.getBody(),Toast.LENGTH_LONG).show();
System.out.println("++From++" + message.getFrom() + "++Body++" + message.getBody());
}
}
}
@
Override
public void pingFailed() {
}
private class XMPPConnectionListener implements ConnectionListener {
@
Override
public void connected(XMPPConnection connection) {
Log.e("success", "Connected");
try {
searchUsers(loginUser);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
} catch (XMPPException.XMPPErrorException e) {
e.printStackTrace();
} catch (SmackException.NoResponseException e) {
e.printStackTrace();
}
// CreateAccount();
}
@
Override
public void authenticated(XMPPConnection connection, boolean resumed) {
}
@
Override
public void connectionClosed() {
}
@
Override
public void connectionClosedOnError(Exception e) {
System.out.println("+_" + e.toString());
}
@
Override
public void reconnectionSuccessful() {
}
@
Override
public void reconnectingIn(int seconds) {
}
@
Override
public void reconnectionFailed(Exception e) {
}
}
public void searchUsers(String userName) throws SmackException.NotConnectedException, XMPPException.XMPPErrorException, SmackException.NoResponseException {
UserSearchManager search = new UserSearchManager(connection);
Form searchForm = search
.getSearchForm("search." + connection.getServiceName());
Form answerForm = searchForm.createAnswerForm();
answerForm.setAnswer("Username", true);
answerForm.setAnswer("search", userName);
ReportedData data = search
.getSearchResults(answerForm, "search." + connection.getServiceName());
if (data.getRows() != null) {
for (ReportedData.Row row: data.getRows()) {
for (String value: row.getValues("jid")) {
Log.i("Iteartor values......", " " + value);
}
}
} else {
CreateAccount();
}
}
Получение одинаковой ошибки при использовании в качестве user1 @ myserver ... Я пробовал это до вызова метода login(). Потому что я хочу знать, существует ли пользователь или нет ... – Manikandan
Поскольку я знаю, что невозможно выполнить Jabber Search перед входом в систему, у меня была такая же проблема (автоматическая регистрация при первом входе в систему) и пришлось реализовать уродливое обходное решение ... tell мне, если вам интересно (однако для поиска jabber требуется полный jid, и не только userid) – MrPk
Спасибо за ответ..Yes..after googled. Я мог бы знать, что использовать login для api нельзя до входа в систему. Или я использовал этот вариант. [http://stackoverflow.com/questions/6931100/smack-api-user-search/6936698#6936698]..просмотрите. – Manikandan