2016-08-08 1 views
1

Я начал разрабатывать чат-приложение. Мне нужно было проверить, что пользователь зарегистрировался или нет на сервере 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(); 
    } 
} 

ответ

1

Строка вы ищете сусло быть JID, а не как имя пользователя:

вам нужно что-то вроде:

[email protected] 

и не только

user1 

Тогда это совершенно бесполезно в вашем случае, чтобы проверить JID.

+0

Получение одинаковой ошибки при использовании в качестве user1 @ myserver ... Я пробовал это до вызова метода login(). Потому что я хочу знать, существует ли пользователь или нет ... – Manikandan

+0

Поскольку я знаю, что невозможно выполнить Jabber Search перед входом в систему, у меня была такая же проблема (автоматическая регистрация при первом входе в систему) и пришлось реализовать уродливое обходное решение ... tell мне, если вам интересно (однако для поиска jabber требуется полный jid, и не только userid) – MrPk

+0

Спасибо за ответ..Yes..after googled. Я мог бы знать, что использовать login для api нельзя до входа в систему. Или я использовал этот вариант. [http://stackoverflow.com/questions/6931100/smack-api-user-search/6936698#6936698]..просмотрите. – Manikandan

1

меня зарегистрировать пользователя с помощью ниже код на привкусом 4,1: -

//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; 
    } 

Используя выше два способа зарегистрировать пользователя успешно ejabberd.

И Connect Метод: -

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

Также вы хотите, чтобы проверить конфигурацию на стороне ejabberd также.

Его работа для меня попыталась использовать ответ: - Smack API User search.

Надеюсь, что это вам пригодится.

Смежные вопросы