Help us understand the problem. What is going on with this article?

【Android】WebViewでWebStorage(LocalStorage)を使用・削除する方法

More than 1 year has passed since last update.

AndroidでWebViewを使用、Html5側でAndroid端末側のWebStorageにタブの位置などを保存することとなったため、対応。
調査し、対応した結果をメモとして残しておきます。

使用方法

Html5側で対応するだけではダメで、Android側のWebView定義の際、以下を行なう必要がある。

webView = view.findViewById(R.id.webview) as WebView

// JavaScriptをONにする
webView.settings.javaScriptEnabled = true

// Storageの使用許可
webView.settings.domStorageEnabled = true

// API Level 19より前の場合はデータベースの保存場所の指定が必要
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    val path : String = this.getDir("データベースの名前", Context.MODE_PRIVATE).path
    webView.settings.databasePath = path
}

削除方法

上記で、Html5側からWebViewのWebStorageは使用出来るようになったが、1つ問題が発生。
ヒストリーバックでタブ位置など保存された状態を復元することはいいが、
WebViewを再生成した場合やアプリの再起動した後でも状態が保存されていた。

仕様にもよると思うが、今回は上記の場合はタブ位置を初期化させておきたいため、WebStorageを削除したい。
調査の結果、onCreateやonDestoryのタイミングなどで以下を実行することで削除が可能。

// 保存されているJavaScript WebStorage(LocalStorage)の削除
WebStorage.getInstance().deleteAllData()

これにより、WebViewのヒストリーバック時や再読込時のみ、WebStorageが使用される。

感想

iOSのWKWebViewではこの辺りは自動でやってくれているみたい。
AndroidのWebViewめんど(ry
もっといい方法あるよ!とか、ここはこうしたほうがいいよ!とかあったら教えていただきたいです。

参考サイト

■HTML5のWebStorageを利用できるようにする
http://www110.kir.jp/Android/ch0809.html

■公式リファレンス
https://developer.android.com/reference/android/webkit/WebStorage.html#deleteOrigin(java.lang.String)

hokutonikukyu
Androidのコンポーネント+柴犬好きエンジニア。 レイアウト作成はConstraintLayoutより、LinearLayout派。 夢はたくさんの柴の子犬に囲まれて、芝生の上で寝ること。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away