AndroidによるWebViewアプリ作成(HWアクセラレータ編)
はじめに
事前に作っていたクソアプリを見直すことにしました。
Webビュー形式のアクティビティにURL直リンで開くとロードが2,3回続くわけのわからないあの泥Webビューです。
主に画面下にJavaScriptを使用した追っかけバナーなどを貼ってあるサイトを開くとロードが途切れ途切れにおきます。
なんぞやと思っていましたが、JavaScriptっぽいです。2chまとめとかに大量にあるアフィリ案件を都度JSで読み込み直すので、実装するとおもしろいものがみれます。
とりあえずキャッシュ
キャッシュを設定します。容量は大体、8Mぐらいがふつうらしいです。
キャッシュモードとかゆうのがあるそうです。
http://dayafterneet.blogspot.jp/2011/08/androidwebview_23.html
今回は見なかったことにしました…
FLASHをオフでUAはデフォで文字コードはサイトに合わせて、
文字コードは遷移先で変更になったらどうなるか試してないです。
wv = (WebView) findViewById(R.id.webView);
wv.setWebViewClient(new WebViewClient());
wv.getSettings().setJavaScriptEnabled(true); // JavaScriptON
wv.getSettings().setPluginsEnabled(false); // Flash OFF
wv.getSettings().setDefaultTextEncodingName("UTF-8"); // デフォルト文字コード
wv.getSettings().setAppCacheEnabled(true); // キャッシュ ON
wv.getSettings().setAppCacheMaxSize(16 * 1024 * 1024); // キャッシュサイズ 16MB
wv.setVerticalScrollbarOverlay(true);
wv.addJavascriptInterface(new JavascriptAdapter(), "android");
// wv.getSettings().setUserAgentString("Android"); // ユーザーエージェント
wv.loadUrl("読み込みたいURL");
リンク先のJavaScriptを有効化/無効化
諸悪の根源はJavaScriptです。JavaScriptさえ消せばなんとかなります。
まずはリンク先のホストを見て、必要なところだけを適切に分岐するようにします。
"JSを有効化したいURLのホスト" だけ、JavaScriptをONにしその他、OFF。
他は適切に分岐させました。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Uri.parse(url).getHost().equals("spnet1.i-mobile.co.jp")) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
} else if (url.substring(0, 7).equals("mailto:")) {
Uri uri = Uri.parse(url);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SENDTO);
intent.setData(Uri.parse(url));
startActivity(Intent.createChooser(intent, "メール"));
} else if (url.substring(0, 7).equals("market:")) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
} else if (url.substring(0, 6).equals("https:")) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
} else if (Uri.parse(url).getHost().equals("JSを有効化したいURLのホスト")) {
wv.getSettings().setJavaScriptEnabled(true); // JavaScriptON
view.loadUrl(url);
} else {
wv.getSettings().setJavaScriptEnabled(false); // JavaScriptOFF
view.loadUrl(url);
}
return true;
}
リンク元のJavaScriptを有効化/無効化
今回はバックキーでの挙動で、JavaScriptの有効化/無効化をしています。
上記で JavaScriptOFF されていたら ONに戻すという訳です。
UIが複雑だともっといじらないと行けないんですが…手抜き…乙!
// 戻るキーのWebView対応
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN
&& keyCode == KeyEvent.KEYCODE_BACK && wv.canGoBack() == true) {
// 戻るキーJavaScriptの有効範囲を指定
WebBackForwardList mWebBackForwardList = wv.copyBackForwardList();
String historyUrl = mWebBackForwardList.getItemAtIndex(
mWebBackForwardList.getCurrentIndex() - 1).getUrl();
if (Uri.parse(historyUrl).getHost().equals("JSを有効化したいURLのホスト")) {
wv.getSettings().setJavaScriptEnabled(true);
}
wv.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
ハードウェアアクセラレータの実装
次に、ハードウェアアクセラレータを実装しました。
エミュレータで動かすとなんか落ちる…(謎
アクセラレータはAndroidの2系だと動かないらしいです。3系以降対応とか…
まずビルドターゲットを設定します。
プロジェクトを右クリック→Android→ターゲットのAPIレベルを11以降に設定します。
次に、manifestファイルをいじります。
必要箇所は以下の点で、SDK指定と、
アプリごとのアクセラレータ指定 OR アクティビティごとの指定となり
その点は自由に指定できるようになっています。
ソースのほうでとくにインクルードする必要はないです。
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="11"/>
<application
…
android:hardwareAccelerated="true">
<activity
…
android:hardwareAccelerated="false">
まとめ
アクセラレータ指定は以外とラクでした。
さんざんググった過去の経験はなんだったんだ……
ちなみにちゃんとテストしてません。
ビルド指定しているんで2系で動かないように指定しているため、
エラー報告はあがらないはずです。
WebViewのJavaScript実装がひどいことはよくわかった。