2011年2月23日水曜日

WebViewでローカルのHTMLファイルを表示する(1)

WebViewのload系のメソッドは"loadData(String)"、"loadDataWithBaseURL(String)"、"loadUrl(String)"の3つである。
http://developer.android.com/intl/ja/reference/android/webkit/WebView.html

普通にWebサイトを見るときにはloadUrlで簡単に見られる。
ローカルファイルのパスを指定してWebViewで表示する方法についてはWebViewでローカルのHTMLファイルを表示する(2)に書いている。

以下はloadDataメソッドを使ってHTMLファイルを表示する方法を記す。

loadData(String)のストリングにはHTMLの文字列を入力する。
なので、ローカルのHTMLファイルをWebViewで読む際は、
  ファイルの内容をString変数に代入 → その変数をWebViewで表示
という処理になる。

公式リファレンスの例

String summary = "<html><body>You scored <b>192</b> points.</body></html>";
 webview.loadData(summary, "text/html", "utf-8");

実際に行なってみて、つまづいた箇所が2つ。

・文字コードの問題
String変数に代入する時点で、文字コードはUTF-8になっている。なので、文字コードの指定はUTF-8でいいのだが、困った点がひとつ。
<META http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS"> などのヘッダー情報が書き込まれている場合。
この場合、WebViewがヘッダーの文字コード宣言に引っ張られてしまって、文字化けする。
正しい解決方法は文字コードをSHIFT-JISにしてWebViewに読ませることだと思うが、よく分からないので今回はcharset=SHIFT_JISを無理やり削る方法をとった。

・loadDataメソッドのバグの問題
http://yujideveloper.wordpress.com/2010/11/12/android-webkit-webviewloaddata%E3%81%AE%E3%83%90%E3%82%B0/ を参照。
#や%が上手く処理できないとのことです。
loadDataWithBaseURLメソッドの方を使えば上手くいった。(Blog kon: WebViewのloadDataメソッドおよびloadDataWithBaseURLメソッド(1) <リファレンスの翻訳>にも関連の記事あり)

成功したコード

File html = new File (Environment.getExternalStorageDirectory().getAbsolutePath()+"ファイル名");
String s = "";
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(html),"SJIS"));
StringBuffer et = new StringBuffer();
String data;
 while((data = reader.readLine()) != null) {
  et.append(data);
  et.append("\n");
}
s= et.toString();

WebView webView=new WebView(このクラスの名前.this);
setContentView(webView);       
s= s.replaceAll("charset=SHIFT_JIS", "charset=UTF-8");
webView.loadDataWithBaseURL("about:blank",s, "text/html", "UTF-8",null);

} catch (Exception e) {
}

ローカルのファイルをloadUrlではなくloadDataWithBaseURLを使って読み込むことには少なくとも2つメリットがあって、
1.BaseURLを使うことができる
 例えばどこかのサイトの特定のページだけをローカルに保存して読めるようにしておきたい場合、そのページからのリンクが相対パスで書かれていたら、BaseURLが必要になる。
2.loadする際にHTMLの編集ができる
 上の例でもs= s.replaceAll("charset=SHIFT_JIS", "charset=UTF-8")ということを行っているが、他にも表示させたくないものを消すとか、逆に付け加えるなどの細かい手入れが可能になる。

#2011/6/4 文章を少し直した。

0 件のコメント:

コメントを投稿