Ich habe begonnen, Chat-Anwendung zu entwickeln. Ich musste überprüfen, ob der Benutzer registriert ist oder nicht in xmpp server.So, wenn der Benutzer versucht, zu registrieren, ich möchte überprüfen, Benutzer hat bereits registriert oder nicht in xmpp Server. Nach xmpp Server erfolgreich verbunden ist, versucht als Nummer mit Usersearchmanager.But Erste Fehler alsWie benutze UserSearchManager um zu überprüfen, ob der Benutzer in xmpp registriert ist oder nicht?
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)
-Code zu suchen:
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();
}
}
bekommen gleichen Fehler, wenn ich als user1 @ myserver ... Ich versuchte dies vor Aufruf login() -Methode. Weil ich wissen möchte, ob Benutzer existieren oder nicht ... – Manikandan
Da ich weiß, dass es nicht möglich ist, Jabber Search vor einer Anmeldung durchzuführen, hatte ich das gleiche Problem (automatische Registrierung beim ersten Login) und musste eine hässliche Workaround implementieren ... sagen ich, wenn Sie interessiert sind (aber Jabber-Suche benötigt eine volle jid und nicht nur Benutzer-ID) – MrPk
Danke für die Antwort..Ja ... nach Googeln konnte ich wissen, dass es nicht möglich ist, Search API vor dem Login zu verwenden. alternativ habe ich diesen benutzt. [http://stackoverflow.com/questions/6931100/smack-api-user-search/6936698#6936698]..check es aus. – Manikandan