Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

localStorage html5 feature not working in WebView on Samsung Android device

I have a html5 application that I wrap with a WebView. To store and retrieve user input values between pages, I use the localStorage html5 feature.

It works fine on my Nexus 4 (Android 4.4.4), but it does not work on Samsung Galaxy Tab 2 (Android 4.3.x) (= nothing happens, but also no error in logcat). Or, to be more clear: on Samsung, it does not work if the html pages are loaded from within the app's asset folder. It does work though if I put the pages on a server, as below in the outcommented line.

However, on Nexus 4, loading from file:///android_asset/ and also if I load the pages on a desktop browser (Chrome, Firefox) from file:// path, it is also working.

Update 1: I just had another user who reported the issue with a LG device, so it does not seem to be Samsung specific.

Update 2: Storing and loading the value from localStorage works fine on all devices on the same page, however, not between different pages. In my example, I can store and retrieve the value on 01_home.html, but when I go to another page in the android_asset folder, I cannot read it anymore (on LG, Samsung devices). Works fine on Nexus 4 though.

Below are the settings of the web view.

    webView = (WebView)this.findViewById(R.id.webView);
    webViewClient = new MyWebViewClient(this);
    webViewClient.setSm(sm);
    webView.setWebViewClient(webViewClient);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    webView.getSettings().setAppCacheEnabled(false);
    webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setBuiltInZoomControls(false);
    webView.getSettings().setSupportZoom(false);
    webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);

    webView.loadUrl("file:///android_asset/01_home.html"); // does NOT work!
    // webView.loadUrl("http://192.168.178.33/01_home.html"); // does work!

Local storage code in the pages:

// storing
var data = document.getElementById('data').value;
window.localStorage.setItem((1), data);

// reading
document.getElementById('data').value = window.localStorage.getItem(1);
like image 853
Mathias Conradt Avatar asked Sep 29 '14 17:09

Mathias Conradt


2 Answers

There are answers to this posted elsewhere Android webview & localStorage

Solution proposed:

webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setDatabaseEnabled(true);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
   webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
}
like image 127
David Glance Avatar answered Oct 19 '22 16:10

David Glance


I found this same bug. Worked on all Nexus devices but all Samsung devices lost my user changes. I know the below method is deprecated but it solved my issue.

webview.getSettings().setDatabasePath("/data/data/" + webview.getContext().getPackageName() + "/databases/");
like image 45
user01000101 Avatar answered Oct 19 '22 15:10

user01000101