title: Maintain cookie session in Android
body: <p>Okay, I have an android application that has a form in it, two EditText, a spinner, and a login button. The user selects the service from the spinner, types in their user name and password, and clicks login. The data is sent via POST, a response is returned, it's handled, a new WebView is launched, the html string generated from the response is loaded, and I have the home page of whatever service the user selected. </p>
  
  <p>That's all well and good. Now, when the user clicks on a link, the login info can't be found, and the page asks the user to login again. My login session is being dropped somewhere, and I'm not certain how to pass the info from the class that controls the main part of my app to the class that just launches the webview activity.</p>
  
  <p>The onClick handler from the form login button:</p>
  
  <pre><code>private class FormOnClickListener implements View.OnClickListener {
  
      public void onClick(View v) {
  
          String actionURL, user, pwd, user_field, pwd_field;
  
          actionURL = "thePageURL";
          user_field = "username"; //this changes based on selections in a spinner
          pwd_field = "password"; //this changes based on selections in a spinner
          user = "theUserLogin";
          pwd = "theUserPassword";
  
          List&lt;NameValuePair&gt; myList = new ArrayList&lt;NameValuePair&gt;();
          myList.add(new BasicNameValuePair(user_field, user)); 
          myList.add(new BasicNameValuePair(pwd_field, pwd));
  
          HttpParams params = new BasicHttpParams();
          DefaultHttpClient client = new DefaultHttpClient(params);
          HttpPost post = new HttpPost(actionURL);
          HttpResponse response = null;
          BasicResponseHandler myHandler = new BasicResponseHandler();
          String endResult = null;
  
          try { post.setEntity(new UrlEncodedFormEntity(myList)); } 
          catch (UnsupportedEncodingException e) { e.printStackTrace(); } 
  
          try { response = client.execute(post); } 
          catch (ClientProtocolException e) { e.printStackTrace(); } 
          catch (IOException e) { e.printStackTrace(); }  
  
          try { endResult = myHandler.handleResponse(response); } 
          catch (HttpResponseException e) { e.printStackTrace(); } 
          catch (IOException e) { e.printStackTrace(); }
  
          List&lt;Cookie&gt; cookies = client.getCookieStore().getCookies();
          if (!cookies.isEmpty()) {
              for (int i = 0; i &lt; cookies.size(); i++) {
                  cookie = cookies.get(i);
              }
          }
  
         Intent myWebViewIntent = new Intent(MsidePortal.this, MyWebView.class);
         myWebViewIntent.putExtra("htmlString", endResult);
         myWebViewIntent.putExtra("actionURL", actionURL);
         startActivity(myWebViewIntent);
      }
  }
  </code></pre>
  
  <p>And here is the WebView class that handles the response display:</p>
  
  <pre><code>public class MyWebView extends android.app.Activity {
  
      private class MyWebViewClient extends WebViewClient {
  
          @Override
          public boolean shouldOverrideUrlLoading(WebView view, String url) {
              view.loadUrl(url);
              return true;
          }
      }
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
  
          super.onCreate(savedInstanceState);
          setContentView(R.layout.web);
  
          MyWebViewClient myClient = new MyWebViewClient();
          WebView webview = (WebView)findViewById(R.id.mainwebview);
          webview.getSettings().setBuiltInZoomControls(true); 
          webview.getSettings().setJavaScriptEnabled(true); 
          webview.setWebViewClient(myClient);
  
          Bundle extras = getIntent().getExtras();
          if(extras != null) 
          {
              // Get endResult
              String htmlString = extras.getString("htmlString");
              String actionURL = extras.getString("actionURL");
  
              Cookie sessionCookie = MsidePortal.cookie;
              CookieSyncManager.createInstance(this);
              CookieManager cookieManager = CookieManager.getInstance();
              if (sessionCookie != null) {
                  cookieManager.removeSessionCookie();
                  String cookieString = sessionCookie.getName()
                          + "=" + sessionCookie.getValue()
                          + "; domain=" + sessionCookie.getDomain();
                  cookieManager.setCookie(actionURL, cookieString);
                  CookieSyncManager.getInstance().sync();
              }  
  
              webview.loadDataWithBaseURL(actionURL, htmlString, "text/html", "utf-8", actionURL);}
          }
      }
  }
  </code></pre>
  
  <p>I've had mixed success implementing that cookie solution. It seems to work for one service I log into that I know keeps the cookies on the server (old, archaic, but it works and they don't want to change it.) The service I'm attempting now requires the user to keep cookies on their local machine, and it does not work with this setup.</p>
  
  <p>Any suggestions?</p>