localStorage html5 功能在三星 Android 设备上的 WebView 中不起作用

Posted

技术标签:

【中文标题】localStorage html5 功能在三星 Android 设备上的 WebView 中不起作用【英文标题】:localStorage html5 feature not working in WebView on Samsung Android device 【发布时间】:2014-11-24 03:52:37 【问题描述】:

我有一个用 WebView 包装的 html5 应用程序。为了在页面之间存储和检索用户输入值,我使用 localStorage html5 功能。

它在我的 Nexus 4 (android 4.4.4) 上运行良好,但在三星 Galaxy Tab 2 (Android 4.3.x) 上无法运行(= 没有任何反应,但 logcat 也没有错误)。 或者,更清楚地说:在三星上,如果 html 页面是从应用程序的资产文件夹中加载的,则它不起作用。但是,如果我将页面放在服务器上,它确实可以工作,如下面的注释行。

但是,在 Nexus 4 上,从 file:///android_asset/ 加载,如果我从 file:// 路径加载桌面浏览器(Chrome、Firefox)上的页面,它也可以正常工作。

更新 1:我刚刚有另一个用户报告了 LG 设备的问题,所以它似乎不是三星特有的。

更新 2:从 localStorage 存储和加载值在同一页面上的所有设备上都可以正常工作,但在不同页面之间却不行。在我的示例中,我可以存储和检索 01_home.html 上的值,但是当我转到 android_asset 文件夹中的另一个页面时,我无法再读取它(在 LG、三星设备上)。不过在 Nexus 4 上运行良好。

以下是网页视图的设置。

    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!

页面中的本地存储代码:

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

// reading
document.getElementById('data').value = window.localStorage.getItem(1);

【问题讨论】:

Android 开发者列表主题:groups.google.com/forum/#!topic/android-developers/gssOdQLroAY 我也有同样的问题。你找到解决方案了吗? 【参考方案1】:

在其他地方发布了此问题的答案Android webview & localStorage

提出的解决方案:

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/");

【讨论】:

【参考方案2】:

我发现了同样的错误。在所有 Nexus 设备上工作,但所有三星设备丢失了我的用户更改。我知道以下方法已弃用,但它解决了我的问题。

webview.getSettings().setDatabasePath("/data/data/" + webview.getContext().getPackageName() + "/databases/");

【讨论】:

以上是关于localStorage html5 功能在三星 Android 设备上的 WebView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

停止在三星设备上的科尔多瓦 webview 中无休止地缓冲 html5 视频

android html5 localstorage某手机从localstorage中取不到数据

在 HTML5 和 JavaScript 中循环访问 localStorage

HTML5 视频无法在三星 S8、三星浏览器上播放

[html5]localStorage的原理和HTML5本地存储安全性

html5 localstorage 怎么取存储条数