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 件のコメント:
コメントを投稿