AndroidでWebスクレイプしたHtmlを表示したくて、いろいろ試してみました。
WebViewに渡してやれば表示されるだろうと思ってたけど、
<img>タグで指定した画像が表示されなかったのです。
画像が?で表示されてしまう。
上がWebView 下がTextView |
WebViewで<img>タグ使えないのかと勝手な思い込みで、
TextViewに表示してみることにしました。
表示させたいHtmlはこんな感じ。
// Header
String data = "<html><head><meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\"></head>";
//<img>タグ
data += "<div><img src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVAP50lVKq4kiypEuO7d0NqvOR0CCowbtRBUG0Zctzdu5nca4GXs0rdcrkUU9Jk9oa8SGWkaLLk1cVQVPowCao7xuV3SAuwrA80rbAQNcjtsPRRTqO6F51bS6LCxz0e1pyH6-yrxnwkF0/s220/CIMG0998.JPG\"></div> ";
// <a>タグ
data += "<a href=\"http://gettingsignals.blogspot.com/\">gettingsignals</a>";
TextViewに画像表示するにはHtml.ImageGetter()を使います。
TextView textView = (TextView)findViewById(R.id.textView);
// <a>タグに対応
MovementMethod movementmethod = LinkMovementMethod.getInstance();
textView.setMovementMethod(movementmethod);
// <img>タグのsrcに指定された画像urlから画像を取得
textView.setText(Html.fromHtml(data, new Html.ImageGetter(){
public Drawable getDrawable(String source){
// img srcで指定されたURLからDrawable を取得する
Drawable d = doGetDrawable(source);
// 取得した元画像のサイズを取得し、表示画像のサイズとする
if(d != null) {
int w = d.getIntrinsicWidth();
int h = d.getIntrinsicHeight();
d.setBounds(0, 0, w, h);
}
return d;
}
}, null));
// Drawableを取得するメソッド
public static Drawable doGetDrawable( String url )
{
Drawable drawable = null;
try
{
HttpGet method = new HttpGet( url );
DefaultHttpClient client = new DefaultHttpClient();
method.setHeader( "Connection", "Keep-Alive" );
HttpResponse response = client.execute( method );
int status = response.getStatusLine().getStatusCode();
if ( status == HttpStatus.SC_OK ) {
InputStream is = response.getEntity().getContent();
drawable = Drawable.createFromStream(is, "");
is.close();
}
}
catch ( Exception e )
{
e.printStackTrace();
return null;
}
return drawable;
}
実装完了。
で、試してみる。
UnknownHostException
AndroidManifest.xml にパーミッションの追加漏れ。。
<uses-permission android:name="android.permission.INTERNET"/>
もう一度、実行。
上がWebView 下がTextView |
WebViewも表示されてる・・・。
単純にパーミッションの追加漏れが原因だったようです。
最後にWebViewのコード
WebView webView = (WebView)findViewById(R.id.webView);
webView.setWebViewClient(new WebViewClient() {});
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginsEnabled( true );
// Headerはつけておくと文字化けとかしない。
String data = "<html><head><meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\"></head>";
data += "<div><img src=\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVAP50lVKq4kiypEuO7d0NqvOR0CCowbtRBUG0Zctzdu5nca4GXs0rdcrkUU9Jk9oa8SGWkaLLk1cVQVPowCao7xuV3SAuwrA80rbAQNcjtsPRRTqO6F51bS6LCxz0e1pyH6-yrxnwkF0/s220/CIMG0998.JPG\"></div> ";
data += "<a href=\"http://gettingsignals.blogspot.com/\">gettingsignals</a>";
// webView.loadData()でもいいけど、特定の文字(%とか)が含まれてると表示されないらしい。
webView.loadDataWithBaseURL(null, data, "text/html", "UTF-8", null);
0 件のコメント:
コメントを投稿