AndroidによるWebViewアプリ作成（HWアクセラレータ編）

# AndroidによるWebViewアプリ作成（HWアクセラレータ編）


## はじめに
事前に作っていたクソアプリを見直すことにしました。
Webビュー形式のアクティビティにURL直リンで開くとロードが２，３回続くわけのわからないあの泥Webビューです。
主に画面下にJavaScriptを使用した追っかけバナーなどを貼ってあるサイトを開くとロードが途切れ途切れにおきます。
なんぞやと思っていましたが、JavaScriptっぽいです。2chまとめとかに大量にあるアフィリ案件を都度JSで読み込み直すので、実装するとおもしろいものがみれます。


## とりあえずキャッシュ
キャッシュを設定します。容量は大体、8Mぐらいがふつうらしいです。
キャッシュモードとかゆうのがあるそうです。
http://dayafterneet.blogspot.jp/2011/08/androidwebview_23.html

今回は見なかったことにしました…
FLASHをオフでUAはデフォで文字コードはサイトに合わせて、
文字コードは遷移先で変更になったらどうなるか試してないです。


```java:BrowserActivity.java

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。
他は適切に分岐させました。


```java:BrowserActivity.java

@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が複雑だともっといじらないと行けないんですが…手抜き…乙！


```java:BrowserActivity.java

// 戻るキーの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の２系だと動かないらしいです。３系以降対応とか…

まずビルドターゲットを設定します。
プロジェクトを右クリック→Android→ターゲットのAPIレベルを11以降に設定します。

次に、manifestファイルをいじります。
必要箇所は以下の点で、SDK指定と、
アプリごとのアクセラレータ指定 OR アクティビティごとの指定となり
その点は自由に指定できるようになっています。

ソースのほうでとくにインクルードする必要はないです。


```xml:AndroidManifest.xml

    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="11"/>

    <application
	…
        android:hardwareAccelerated="true">

		<activity
		…
        android:hardwareAccelerated="false">

```

参考資料
http://stackoverflow.com/questions/12637584/android-2-2-webview-causes-opengl-es-api-with-no-current-context-logged-once-pe

## まとめ
アクセラレータ指定は以外とラクでした。
さんざんググった過去の経験はなんだったんだ……
ちなみにちゃんとテストしてません。

ビルド指定しているんで２系で動かないように指定しているため、
エラー報告はあがらないはずです。

WebViewのJavaScript実装がひどいことはよくわかった。