title: Android - Remote Login successful but login state is not retained
body: <p>I have an android app that retrieves data from a remote server, including authentication. Remote server is using Yii. Our iPhone version is using the remote web service and there's no issue at all. But with our Android: 1) we can login, server returns 200; 2) but next page when we try to call another api to query the db, it keeps returning error that user is not logged in. </p>
  
  <p>What I've done:
  1. Check the user session in the back end. Yes, after logging in from android, user sessions appears active.
  2. Use the same API call with Firefox's POSTER. Yes, it can retrieve data.</p>
  
  <p>What might have gone wrong? Can someone please help? Thanks a lot!</p>
  
  <p>Here's my login code:</p>
  
  <pre><code>package ...
  import ...
  
  public class Login extends Activity implements OnClickListener {
  
      EditText etUser, etPass;
      Button bLogin, btnCancel;
  
      //Create string variables that will have the input assigned to them
      String username, password;
  
      //Create a HTTPClient as the form container
      HttpClient httpclient;
  
      //Use HTTP POST method
      HttpPost httppost;
  
      //Create an array list for the input data to be sent
      ArrayList&lt;NameValuePair&gt; nameValuePairs;
  
      //Create a HTTP Response and HTTP Entity
      HttpResponse response;
      org.apache.http.HttpEntity entity;
  //    protected static final String TAG = MainActivity.class.getSimpleName();
      final String url = "..remote api...";
   // JSON Node names
       private static final String TAG_CONTACTS = "users";
       // contacts JSONArray
       JSONArray contacts = null;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
  
          super.onCreate(savedInstanceState);
          setContentView(R.layout.login);
  
          initialise();
  
      }
  
  
  
      private void initialise() {
          etUser = (EditText) findViewById(R.id.txtUname);
          etPass = (EditText) findViewById(R.id.txtPwd);
          bLogin = (Button) findViewById(R.id.sumit_login);
          btnCancel = (Button) findViewById(R.id.btn_Cancel);
          //Now to set an onClickListener
  
          bLogin.setOnClickListener(this);
  
          btnCancel.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View arg0) {
                  Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                  startActivity(intent);  
              }
          });
      }
  
      public void onClick(View v)  {
          // This is where we will be working now
          if (etUser.getText().toString().length() == 0
                  || etPass.getText().toString().length() == 0) {
              Toast.makeText(getApplicationContext(),
                      "Please enter username and password",
                      Toast.LENGTH_SHORT).show();
          } else {
              new MyAsyncTask().execute();
          }
  
      }//END onClick()
  
      private static String convertStreamToString(InputStream is) {
          BufferedReader reader = new BufferedReader(new InputStreamReader(is));
          StringBuilder sb = new StringBuilder();
  
          String line = null;
          try {
              while ((line = reader.readLine()) != null) {
                  sb.append(line + "\n");
              }
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              try {
                  is.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          return sb.toString();
      }//END convertStreamToString()
  
  
  
      private class MyAsyncTask extends AsyncTask&lt;Void, Void, Integer&gt;
      {
          ProgressDialog mProgressDialog;
  
  
          @Override
          protected void onPreExecute() {
              super.onPreExecute();
              mProgressDialog = new ProgressDialog(Login.this);
              mProgressDialog.setMessage("Authenticating...");
              mProgressDialog.setIndeterminate(false);
              mProgressDialog.setCancelable(false);
              mProgressDialog.show();
          }
  
          @Override
          protected Integer doInBackground(Void... params) {
  
              int repsonStatus = 0;
              //Create new default HTTPClient
              httpclient = new DefaultHttpClient();
  
              //Create new HTTP POST with URL to php file as parameter
              httppost = new HttpPost("... login api ..."); 
  
              //Assign input text to strings
              username = etUser.getText().toString();
              password = etPass.getText().toString();
  
              JSONParser jParser = new JSONParser();
              //Next block of code needs to be surrounded by try/catch block for it to work
              try {
                  //Create new Array List
  //                nameValuePairs = new ArrayList&lt;NameValuePair&gt;(2);
                  List&lt;NameValuePair&gt; nameValuePairs = new ArrayList&lt;NameValuePair&gt;();
                  //place them in an array list
                  nameValuePairs.add(new BasicNameValuePair("login", "login"));
                  nameValuePairs.add(new BasicNameValuePair("username", username));
                  nameValuePairs.add(new BasicNameValuePair("password", password));
                  nameValuePairs.add(new BasicNameValuePair("api_key", "service_api"));
  
  
                  //Add array list to http post
                  httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  
                  //assign executed form container to response
                  response = httpclient.execute(httppost); //response from the PHP file
  
                  Log.i("AirconServer -- header login", response.getAllHeaders().toString());
                  Log.i("postData", response.getStatusLine().toString());
                  HttpEntity entity_ = response.getEntity();
  
                  repsonStatus = response.getStatusLine().getStatusCode();
                  if(response.getStatusLine().getStatusCode() == 200){
                      Log.i("AirconService - ", "LOGIN SUCCESSFUL!");
  
  
                      }
                  } else {
                      Toast.makeText(getApplicationContext(),
                              "Invalid Username or password.",
                              Toast.LENGTH_SHORT).show();
                  }
  
  
              } catch(Exception e){
  
                  e.printStackTrace();
              }
  
              return repsonStatus;
          }
          @Override
  
          protected void onPostExecute(Integer result) {
              mProgressDialog.dismiss();
              if(result == 200) {
                  Intent intent = new Intent(getApplicationContext(), MainMenuActivity.class);
                  startActivity(intent);
              } else {
                  Toast.makeText(getApplicationContext(),
                          "Invalid Username or password.",
                          Toast.LENGTH_SHORT).show();
              }         
          }
      }
  
  }
  </code></pre>
  
  <p>Here's the code for the other call that still asks for logging in while user's already logged in. </p>
  
  <pre><code>public class GetMybookings extends ListActivity {
  
      int TIMEOUT_MILLISEC = 10000;
      ArrayList&lt;jobs&gt; bookings = new ArrayList&lt;jobs&gt;();
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      }
      @Override
      public void onStart() {
          super.onStart();
  
          final Calendar c = Calendar.getInstance();
          int mYear = c.get(Calendar.YEAR);
          final String url = "... api ...";
          new MybookingTask().execute(url);
      }
  
      @Override
      protected void onListItemClick(android.widget.ListView l, android.view.View v, int position, long id) {
          if (this.bookings == null) {
              return;
          }
          startActivity(new Intent(Intent.ACTION_VIEW));
      }
      private void refreshResults(ArrayList&lt;jobs&gt; books) {
  
          setListAdapter(new Mybookings(this,books));
      }
  
      private class MybookingTask extends AsyncTask&lt;String, Void, ArrayList&lt;jobs&gt;&gt; {
  
              ProgressDialog mProgressDialog;
  
  
                      @Override
          protected void onPreExecute() {
                          super.onPreExecute();
                          mProgressDialog = new ProgressDialog(GetMybookings.this);
                          mProgressDialog.setMessage("Loading Bookings...");
                          mProgressDialog.setIndeterminate(false);
                          mProgressDialog.setCancelable(false);
                          mProgressDialog.show();
          }
          protected ArrayList&lt;jobs&gt; doInBackground(String... urls) {
              try {
                  HttpParams httpParams = new BasicHttpParams();
                  HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
                  HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
  
                  HttpClient httpClient = new DefaultHttpClient();
                  HttpGet httpGet = new HttpGet(urls[0]);
                  HttpResponse response = null;
  
                  try {
  
                      ResponseHandler&lt;String&gt; responseHandler = new BasicResponseHandler();
                      String responseBody = httpClient.execute(httpGet, responseHandler);
  
                      response = httpClient.execute(httpGet);
                      Log.i("AirconService GetMyBookings -- header login", response.getAllHeaders().toString());
                      Log.i("postData", response.getStatusLine().toString());
                      Log.i("AirconService GetMyBookings -- response data", response.getEntity().toString());
                      Log.i("AirconService GetMyBookings-- response data", response.toString());
  
                      HttpEntity entity = response.getEntity();
                      String responseString = new String();
                      if(entity != null) {
                          responseString = EntityUtils.toString(entity);
                          Log.i("WHAT???", "??? responseString is: " + responseString);
                      }
  
  
  
                  } catch(ClientProtocolException e) {
                      e.printStackTrace();
  
  
              } catch(Throwable t) {
                  t.printStackTrace();
              }
  
              return null;
          }
          protected void onPostExecute(ArrayList&lt;jobs&gt; result) {
              mProgressDialog.dismiss();
              refreshResults(result);
          }
      }
  }
  </code></pre>
  
  <p><strong>UPDATED</strong></p>
  
  <p>I tried Anand's solution: IT's WORKING!!!</p>
  
  <p>Common.java:</p>
  
  <pre><code>import ...
  
  public class Common {
      public static CookieStore cookieStore = new BasicCookieStore();
  }
  </code></pre>
  
  <p>Login code:</p>
  
  <pre><code>public class Login extends Activity implements OnClickListener {
  
  static HttpContext localContext = new BasicHttpContext();
  </code></pre>
  
  <p>...</p>
  
  <pre><code>   protected Integer doInBackground(Void... params) {
          localContext.setAttribute(ClientContext.COOKIE_STORE, Common.cookieStore);
          //Create new default HTTPClient
          httpclient = new DefaultHttpClient();
  
          //Create new HTTP POST with URL to php file as parameter
          httppost = new HttpPost(... api ...); 
  </code></pre>
  
  <p>Second call after login (in a separate class):</p>
  
  <pre><code>public class GetMybookings extends ListActivity {
  
      static HttpContext localContext = new BasicHttpContext();
          ....
          protected ArrayList&lt;jobs&gt; doInBackground(String... urls) {
              try {
                  HttpClient httpClient = new DefaultHttpClient();
                  HttpGet httpGet = new HttpGet(... api ....);
                  HttpResponse response = null;
  
                  try {
                      localContext.setAttribute(ClientContext.COOKIE_STORE, Common.cookieStore);
                      response = httpClient.execute(httpGet, localContext);
  </code></pre>