2010年12月14日火曜日

androidでWEB接続 その1

最近は、androidを使ったWEB周りのコーディングを行っていました。
WEB周りは今後も色々とコーディングする機会が多そうなので、詳細なメモを残しときます。


・例1
WebViewクラスを利用して、yahooやgoogleなどのサイトに接続する


layoutのxmlにWebViewタグを記述する

<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

activityクラスで呼び出す

private final static String YAHOO_URL = "http://www.yahoo.co.jp/";
private WebView webview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.test);

this.webview = (WebView) findViewById(R.id.webview);
this.webview.loadUrl(YAHOO_URL);
}


manifest.xmlにインターネット接続の許可を記述

<uses-permission android:name="android.permission.INTERNET" />

あとはapkファイルを作成して、アプリを立ち上げればyahooに繋がります。
…とはいえ、このまま使うことはあまりないでしょう。
「構築したサイトにBasic認証で接続」とかが一般的でしょう。
というわけで、WebViewを利用して、Basic認証を行ってみます。

・例2
WebViewクラスを利用して、Basic認証で接続する

Basic認証を行う場合は、activityクラスを以下のように変更します。

private final static String TEST_URL = "http://www.test.com/";

public static final String USERNAME = "hoge";

public static final String PASSWORD = "hogehoge";

public static final String HOST = "www.test.com";

public static final String REALM = "Access Directory";


private WebView webview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);

this.webview = (WebView) findViewById(R.id.webview);

this.webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

this.webview.getSettings().setJavaScriptEnabled(true);
WebViewDatabase.getInstance(this).clearHttpAuthUsernamePassword();
this.webview.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
this.webview.setWebViewClient(new WebViewClient(){

@Override
public void onReceivedHttpAuthRequest (WebView view,
HttpAuthHandler handler, String host, String realm){
String[] up = view.getHttpAuthUsernamePassword(host, realm);
if( up != null && up.length == 2 ) {
handler.proceed(up[0], up[1]);
} else{
Log.d("LOG_TAG","Could not find user/pass for domain :"+
host+" with realm = "+realm);
}
}
});
this.webview.loadUrl(TEST_URL);

}


TEST_URLをhttp://username:password@www.test.com/
と変更しても接続できないので注意してください。

又、Realmまできっちりと設定してください。でないと、動作しません。
あとは、HOSTとURLの指定を間違えないようにしてください。

これでapkファイルを作成して、アプリを立ち上げればbasic認証が行われ、TEST_URLに繋がります。
ただ、basic認証は接続に結構時間がかかるので、プログレスバーを利用したほうがいいでしょう。

なので、
WebViewクラスを利用して、Basic認証で接続
接続開始時にプログレスバーを表示
接続終了時にプログレスバーを非表示にして、toastメッセージを出力

とします。
以下がそのコードです

private final static String TEST_URL = "http://www.test.com/";

public static final String USERNAME = "hoge";

public static final String PASSWORD = "hogehoge";

public static final String HOST = "www.test.com";

public static final String REALM = "Access Directory";

private ProgressDialog mProgressDialog;

private WebView webview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);

this.webview = (WebView) findViewById(R.id.webview);

this.webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

this.webview.getSettings().setJavaScriptEnabled(true);
WebViewDatabase.getInstance(this).clearHttpAuthUsernamePassword();
this.webview.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
this.webview.setWebViewClient(new WebViewClient(){

@Override
public void onReceivedHttpAuthRequest (WebView view,
HttpAuthHandler handler, String host, String realm){
String[] up = view.getHttpAuthUsernamePassword(host, realm);
if( up != null && up.length == 2 ) {
handler.proceed(up[0], up[1]);
} else{
Log.d("LOG_TAG","Could not find user/pass for domain :"+
host+" with realm = "+realm);
}
}


@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//ダイアログを作成して表示
mProgressDialog = new ProgressDialog(view.getContext());
mProgressDialog.setTitle("ネットワーク接続");
mProgressDialog.setMessage("接続中です");
mProgressDialog.show();
}

@Override
public void onPageFinished(WebView wv, String url){

if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
mProgressDialog = null;
Toast.makeText(wv.getContext(), "ネットワーク接続に成功しました", Toast.LENGTH_SHORT).show();
}
}
});
this.webview.loadUrl(TEST_URL);

}


onPageStartedがネットワーク接続開始時に呼び出され、onPageFinishedが接続終了時に呼ばれます。

最後にクッキーも扱えるように処理を追加します。

private final static String TEST_URL = "http://www.test.com/";

public static final String USERNAME = "hoge";

public static final String PASSWORD = "hogehoge";

public static final String HOST = "www.test.com";

public static final String REALM = "Access Directory";

private ProgressDialog mProgressDialog;

private WebView webview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);

this.webview = (WebView) findViewById(R.id.webview);

this.webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

this.webview.getSettings().setJavaScriptEnabled(true);
WebViewDatabase.getInstance(this).clearHttpAuthUsernamePassword();
this.webview.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
this.webview.setWebViewClient(new WebViewClient(){

String loginCookie = "";
@Override
public void onLoadResource(WebView wv,
String url){
CookieManager cMgr = CookieManager.getInstance();
loginCookie = cMgr.getCookie(url);
}

@Override
public void onReceivedHttpAuthRequest (WebView view,
HttpAuthHandler handler, String host, String realm){
String[] up = view.getHttpAuthUsernamePassword(host, realm);
if( up != null && up.length == 2 ) {
handler.proceed(up[0], up[1]);
} else{
Log.d("LOG_TAG","Could not find user/pass for domain :"+
host+" with realm = "+realm);
}
}


@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//ダイアログを作成して表示
mProgressDialog = new ProgressDialog(view.getContext());
mProgressDialog.setTitle("ネットワーク接続");
mProgressDialog.setMessage("接続中です");
mProgressDialog.show();
}

@Override
public void onPageFinished(WebView wv, String url){

CookieManager cMgr = CookieManager.getInstance();
cMgr.setCookie(url, loginCookie);

if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
mProgressDialog = null;
Toast.makeText(wv.getContext(), "ネットワーク接続に成功しました", Toast.LENGTH_SHORT).show();
}
}
});
this.webview.loadUrl(TEST_URL);

}

以上です。
次はURLConnectionクラスを使ったネットワークのつなぎ方を記述する予定です。

それでわ。


参考サイト
http://developer.android.com/reference/android/webkit/WebView.html#setHttpAuthUsernamePassword%28java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String%29

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...