title: Smack "Must have a local (user) JID set" error
body: <p>Unable to understand why this error frequently comes and app gets crash.</p>
  
  <p>Below error:</p>
  
  <pre><code>Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.studyboard/com.studyboard.ChatMessageActivity}: 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 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2493)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)
         at android.app.ActivityThread.access$800(ActivityThread.java:176)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
         at android.os.Handler.dispatchMessage(Handler.java:111)
         at android.os.Looper.loop(Looper.java:194)
         at android.app.ActivityThread.main(ActivityThread.java:5576)
         at java.lang.reflect.Method.invoke(Method.java)
         at java.lang.reflect.Method.invoke(Method.java:372)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
  Caused by 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.&lt;init&gt;(IQReplyFilter.java:94)
         at org.jivesoftware.smack.AbstractXMPPConnection.createPacketCollectorAndSend(AbstractXMPPConnection.java:690)
         at org.jivesoftware.smackx.iqlast.LastActivityManager.getLastActivity(LastActivityManager.java:239)
         at com.studyboard.utils.ChatUtil.getLastActivity(ChatUtil.java:674)
         at com.studyboard.ChatMessageActivity.initChat(ChatMessageActivity.java:339)
         at com.studyboard.ChatMessageActivity.onCreate(ChatMessageActivity.java:220)
         at android.app.Activity.performCreate(Activity.java:6005)
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2446)
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)
         at android.app.ActivityThread.access$800(ActivityThread.java:176)
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
         at android.os.Handler.dispatchMessage(Handler.java:111)
         at android.os.Looper.loop(Looper.java:194)
         at android.app.ActivityThread.main(ActivityThread.java:5576)
         at java.lang.reflect.Method.invoke(Method.java)
         at java.lang.reflect.Method.invoke(Method.java:372)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
  </code></pre>
  
  <p><strong>I have tried to solve using the solution given in the following url,but its also not working in my case.Url is:-</strong> <a href="https://community.igniterealtime.org/thread/58150" rel="nofollow noreferrer">https://community.igniterealtime.org/thread/58150</a></p>
  
  <p>Code using for connecting to ejabberd and login using Smack 4.1:-</p>
  
  <pre><code>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 {
          objXmpptcpConnection.connect();
          System.out.println("Connected to===&gt;" + objXmpptcpConnection.getHost());
          objXmpptcpConnection.login();
  
      } catch (XMPPException e) {
          e.printStackTrace();
  
      } catch (SmackException e) {
          e.printStackTrace();
  
      } catch (IOException e) {
          e.printStackTrace();
  
      }
  </code></pre>
  
  <p>Actual error occurs in below function which returns me last status of user for with I am chatting:-</p>
  
  <pre><code>   public String getLastActivity(XMPPTCPConnection objXmpptcpConnection, String strUser) {
  
          try {
              LastActivityManager objLastActivityManager = LastActivityManager.getInstanceFor(objXmpptcpConnection);
              LastActivity objLastActivity = null;
              $$ objLastActivity = objLastActivityManager.getLastActivity(strUser + "@" + Constants.HOST);
              System.out.println("MESSAGE:" + objLastActivity.getStatusMessage());
              System.out.println("IDLE TIME::" + objLastActivity.getIdleTime());
  
              return convertTime(objLastActivity.getIdleTime());
  
          } catch (SmackException.NoResponseException e) {
              e.printStackTrace();
              return "Offline";
          } catch (XMPPException.XMPPErrorException e) {
              e.printStackTrace();
              return "Offline";
          } catch (SmackException.NotConnectedException e) {
              e.printStackTrace();
              return "Offline";
          }
  
      }
  </code></pre>
  
  <p>I have marked error line with <strong><code>$$</code> symbol</strong></p>