4.2 未満の WebView で動作しない JS を何とか、という課題がありまして標準の WebView ではなく、XWalk というソレを使って動作の確認をしてみたので諸々備忘録を。
導入
build.gradle に以下を追加して sync すれば OK です。
repositories {
maven {
url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
}
}
あと、dependencies に以下を追加。
compile 'org.xwalk:xwalk_core_library:10.39.235.15'
それから AndroidManifest.xml に ACCESS_WIFI_STATE な permission を追加します。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
実装
以前調べた時には layout.xml に記述できない、という情報をニギらされてて「使えない」って思っていたのですが普通に使えます。
<org.xwalk.core.XWalkView
あとは View の参照を findViewById で取得して云々すれば良い訳です。そしてほぼ WebView で使えるメソドは同じカンジの名前で使える形になっているようなのですが、http header を追加して云々、な方法が View が提供するメソドとして用意されておりませんでした。
shouldInterceptLoadRequest
これと HttpURLConnection あたりを使って云々しろ、という事らしいです。ハマリ処二点。
-
このメソドの中で HttpURLConnection#disconnect すると WebResourceResponse オブジェクトのコンストラクタに渡す InputStream が無い、って叱られるので、変数を大域で参照できるようにしといて onLoadFinished で disconnect した
-
戻す WebResourceResponse オブジェクトを作るために HttpURLConnection#getContentType とか HttpURLConnection#getContentEncoding とかを使っていたのですが戻ってくる値がアレで html なソースがそのまんま表示されてしまう
以下がざっくりな実装です。
{% gist ad7561a572e8bf8104d7 %}
追記
色々ヤッてて分かったのですが
- shouldOverrideUrlLoading で true を戻すと shouldInterceptLoadRequest には制御は渡らない
みたい。コンテンツ側で色々な細工が入ってて openFileChooser の動作確認ができないというナニ。