2016-08-08 29 views
1

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(); 
    } 
} 

Antwort

1

String Sie suchen muss eine JID, nicht einen Benutzernamen sein:

Sie brauchen so etwas wie:

[email protected] 

und nicht nur

user1 

Dann ist es in Ihrem Anwendungsfall ziemlich nutzlos, nach JID zu suchen.

+0

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

+0

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

+0

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

1

Ich habe Benutzer Code unten auf Smack 4.1 mit registrieren: -

//Login User 
    public XMPPTCPConnection loginUser(Context objContext, XMPPTCPConnection objXmpptcpConnection, String strUsername, String strPassword) { 

     try { 
      AccountManager objAccountManager = AccountManager.getInstance(objXmpptcpConnection); 
      objAccountManager.createAccount(strUsername, strPassword); 
      objXmpptcpConnection = loginToServer(objXmpptcpConnection, strUsername, strPassword); 
     } catch (SmackException | XMPPException e) { 

      System.out.println("Msg=" + e.getMessage() + "\nCause =" + e.getCause() + "\n Local msg=" + e.getLocalizedMessage() + "\n stack=" + e.getStackTrace() + "\n class " + e.getClass()); 
      System.out.println("Code=" + e.getStackTrace()[0].getLineNumber()); 
      if (e.getMessage().contains("conflict")) { 
       objXmpptcpConnection = loginToServer(objXmpptcpConnection, strUsername, strPassword); 
      } 
     } 
     return objXmpptcpConnection; 
    } 

    private XMPPTCPConnection loginToServer(XMPPTCPConnection objXmpptcpConnection, String strUsername, String strPassword) { 

     try { 
      objXmpptcpConnection.login(strUsername + "@" + AppConstants.HOST, strPassword, "example"); 
      // objXmpptcpConnection.sendPacket(new Presence(Presence.Type.unavailable)); 
//objXmpptcpConnection.sendPacket(new Presence(Presence.Type.available)); 
     } catch (XMPPException e) { 
      e.printStackTrace(); 
     } catch (SmackException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Log.i("XMPPChatDemoActivity", "Logged in as " 
       + objXmpptcpConnection.getUser()); 
     Toast.makeText(
       objContext, 
       "log in as " 
         + objXmpptcpConnection.getUser(), 
       Toast.LENGTH_SHORT).show(); 

     return objXmpptcpConnection; 
    } 

Mit über zwei Methoden Benutzer erfolgreich auf ejabberd registrieren.

And Connect-Methode ist: -

public XMPPTCPConnection connect(String strUsername, String strPassword) throws IOException, XMPPException, SmackException { 
    objXmpptcpConnection = null; 
    if (android.os.Build.VERSION.SDK_INT > 9) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
    } 
    // Create a connection 
    XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder(); 
    config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
    config.setServiceName(Constants.HOST); 
    config.setPort(Constants.PORT); 
    config.setHost(Constants.HOST); 
    config.setDebuggerEnabled(true); 
    config.setSendPresence(true); 
    config.setUsernameAndPassword(strUsername + "@" + Constants.HOST, strPassword); 


    SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1"); 
    SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5"); 
    SASLAuthentication.unBlacklistSASLMechanism("PLAIN"); 
    objXmpptcpConnection = new XMPPTCPConnection(config.build()); 
    objXmpptcpConnection.setUseStreamManagement(true); 
    objXmpptcpConnection.setUseStreamManagementResumption(true); 
    try { 
     ProviderManager objProviderManager = new ProviderManager(); 
     ProviderManager.addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider()); 
     ProviderManager.addExtensionProvider(DeliveryReceiptRequest.ELEMENT, new DeliveryReceiptRequest().getNamespace(), new DeliveryReceiptRequest.Provider()); 
     ProviderManager.addIQProvider("query", "http://jabber.org/protocol/bytestreams", new BytestreamsProvider()); 
     ProviderManager.addIQProvider("query", "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider()); 
     ProviderManager.addIQProvider("query", "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider()); 

     // Offline Message Requests 
     objProviderManager.addIQProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider()); 

     // Offline Message Indicator 
     objProviderManager.addExtensionProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider()); 
     objXmpptcpConnection.connect(); 
     System.out.println("Connected to===>" + objXmpptcpConnection.getHost()); 
     objXmpptcpConnection.login(); 

     objDeliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(objXmpptcpConnection); 
     objDeliveryReceiptManager.autoAddDeliveryReceiptRequests(); 
     objDeliveryReceiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.disabled); 
     objDeliveryReceiptManager.addReceiptReceivedListener(this); 

    } catch (XMPPException e) { 
     e.printStackTrace(); 
     return objXmpptcpConnection; 
    } catch (SmackException e) { 
     e.printStackTrace(); 
     return objXmpptcpConnection; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return objXmpptcpConnection; 
    } 
    return objXmpptcpConnection; 
} 

Auch möchten Sie ejabberd Seite Konfiguration auch überprüfen.

Es funktioniert für mich versucht mit der Antwort: - Smack API User search.

Ich hoffe, es ist nützlich für Sie.