LoginSignup
22
22

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-10-07

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

はじめに

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

とりあえずキャッシュ

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

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

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

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

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の2系だと動かないらしいです。3系以降対応とか…

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

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

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

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

まとめ

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

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

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

22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22