ブログトップ 記事一覧 ログイン 無料ブログ開設

chakimarの日記

2011-02-09

HttpClientとWebViewの連携

| 16:04 | HttpClientとWebViewの連携 - chakimarの日記 を含むブックマーク

(Android1.6で確認)

HttpClientでログイン処理を行い、以降はWebViewで操作を行うための処理。

        private WebView mWebView;
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mWebView = new WebView(this);
		mWebView.setWebViewClient(new WebViewClient());
		mWebView.setWebChromeClient(new WebChromeClient());
		mWebView.getSettings().setJavaScriptEnabled(true);
		setContentView(mWebView);
		// WebViewで使うcookieの準備
		CookieSyncManager.createInstance(this);
		CookieSyncManager.getInstance().startSync();
		CookieManager.getInstance().setAcceptCookie(true);
		CookieManager.getInstance().removeExpiredCookie();

		// HttpClientの準備
		DefaultHttpClient httpClient;
		httpClient = new DefaultHttpClient();
		httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BROWSER_COMPATIBILITY);
		httpClient.getParams().setParameter("http.connection.timeout", 5000);
		httpClient.getParams().setParameter("http.socket.timeout", 3000);
		HttpPost httppost = new HttpPost("認証用のアドレス");
		List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
		nameValuePair.add(new BasicNameValuePair("ユーザーキーの名前", "ユーザー名"));
		nameValuePair.add(new BasicNameValuePair("パスワードキーの名前", "パスワード"));
		// ログイン処理
		try {
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePair));
			HttpResponse response = httpClient.execute(httppost);
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			response.getEntity().writeTo(byteArrayOutputStream);
			Log.d(TAG, "response="+byteArrayOutputStream.toString());
		} catch (Exception e) {
			Log.e(TAG,e.getMessage(), e);
		}

		// HttpClientで得たCookieの情報をWebViewでも利用できるようにする
		CookieStore cookieStr = httpClient.getCookieStore();
		cookieStr.clearExpired(new java.util.Date());
		List<Cookie> cookies = cookieStr.getCookies();
		CookieManager cookieManager = CookieManager.getInstance();
		for (Cookie cookie : cookies) {
			String cookieString = cookie.getName() + "=" + cookie.getValue();
			Log.d(TAG, "cookieString="+cookieString);
			cookieManager.setCookie("ドメイン名", cookieString);
			CookieSyncManager.getInstance().sync();
		}

		// ログイン状態で画面にアクセス
		mWebView.loadUrl("トップページのアドレス");

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();

		CookieManager cookieManager = CookieManager.getInstance();
		cookieManager.removeAllCookie();
	}

参考サイトのやり方を試してみたがうまくいかなかった。

最初(または最後)のクッキーしか取得してなかったのがいけなかったんかな?

あと、CookieManager::removeAllCookie()をロード前にやってしまうと

1度セッションタイムアウトしたらログインできなくなってしまった。

クッキーの知識不足+WebViewのセッション管理についてよくわかってなかったため(今も怪しいけど。。。)、はまってしまった。

■参考サイト

http://eshyu.wordpress.com/2010/06/27/syncing-cookies-between-an-httpclient-and-a-webview/

https://gist.github.com/610754

http://blog.mono-koubou.net/archives/44

http://d.hatena.ne.jp/sick_hack/20101015/1287106845

http://stackoverflow.com/questions/1652850/android-webview-cookie-problem

http://d.hatena.ne.jp/urapico/20100307/1267951730

http://stackoverflow.com/questions/678630/how-do-i-make-an-http-request-using-cookies-on-android

(タイムアウトについて)

http://d.hatena.ne.jp/sick_hack/20101015/1287106845

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証