/var/log/messages

debugging with sixth sense

XWalk を使ってみた

4.2 未満の WebView で動作しない JS を何とか、という課題がありまして標準の WebView ではなく、XWalk というソレを使って動作の確認をしてみたので諸々備忘録を。

導入

build.gradle に以下を追加して sync すれば OK です。

1
2
3
4
5
repositories {
    maven {
        url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
    }
}

あと、dependencies に以下を追加。

1
compile 'org.xwalk:xwalk_core_library:10.39.235.15'

それから AndroidManifest.xml に ACCESS_WIFI_STATE な permission を追加します。

1
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

実装

以前調べた時には layout.xml に記述できない、という情報をニギらされてて「使えない」って思っていたのですが普通に使えます。

1
<org.xwalk.core.XWalkView

あとは View の参照を findViewById で取得して云々すれば良い訳です。そしてほぼ WebView で使えるメソドは同じカンジの名前で使える形になっているようなのですが、http header を追加して云々、な方法が View が提供するメソドとして用意されておりませんでした。

shouldInterceptLoadRequest

これと HttpURLConnection あたりを使って云々しろ、という事らしいです。ハマリ処二点。

  • このメソドの中で HttpURLConnection#disconnect すると WebResourceResponse オブジェクトのコンストラクタに渡す InputStream が無い、って叱られるので、変数を大域で参照できるようにしといて onLoadFinished で disconnect した

  • 戻す WebResourceResponse オブジェクトを作るために HttpURLConnection#getContentType とか HttpURLConnection#getContentEncoding とかを使っていたのですが戻ってくる値がアレで html なソースがそのまんま表示されてしまう

以下がざっくりな実装です。

追記

色々ヤッてて分かったのですが

  • shouldOverrideUrlLoading で true を戻すと shouldInterceptLoadRequest には制御は渡らない

みたい。コンテンツ側で色々な細工が入ってて openFileChooser の動作確認ができないというナニ。

Comments