安卓4.0.1破坏了WebView的HTML 5本地存储?

17

我有一个简单的 HTML5 测试页面,使用 LocalStorage 来显示 / 保存 / 重新显示一段数据。

这段代码在 Android 2.3.x 中完美运行,但是在 4.0.1 上在 html 的第 18 行 localStorage.getItem() 调用时记录了一个异常,并且此时 JS 就停止了。

异常:Uncaught Error: SECURITY_ERR: DOM Exception 18 at /data/data/my.app.name/app_htmlData:18 我还尝试将数据库路径设置为 getCacheDir(),但结果相同。

String htmlContent = "HTML content listed below";    
File sharedDir = getActivity().getDir("htmlData", Context.MODE_PRIVATE);
WebView browser = (WebView)v.findViewById(R.id.wvBrowser);

browser.setWebChromeClient(new WebChromeClient(){
    public void onExceededDatabaseQuota(String url, String databaseIdentifier, long  currentQuota, long estimatedSize,   long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 
            quotaUpdater.updateQuota(estimatedSize * 2); 
        }
    });       
browser.setWebViewClient(new WebViewClient(){
    @Override
    public void onPageFinished(WebView view, String url){

        view.loadUrl("javascript:doTest()");

    });

browser.getSettings().setDatabaseEnabled(true);
browser.getSettings().setDatabasePath(sharedDir.getPath());
browser.getSettings().setDomStorageEnabled(true);
browser.loadDataWithBaseURL(mSharedDir.getPath(), 
            htmlContent, 
            "text/html", 
            "utf-8", 
            null);
页面正在呈现的HTML代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Simple localStorage test</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script type="text/javascript">

        function doTest() {
            $('#stuff').append('<p>reading</p>');
            var item = read();

            $('#stuff').append('<p>writing</p>');
            localStorage['bar'] = new Date().toUTCString();

            $('#stuff').append('<p>&nbsp;</p><p>reading again</p>');
            read();
        }
        function read() {
            var item = localStorage.getItem('bar');
            if (item == null || (item == undefined)) {
                item = '';
            }
            $('#stuff').append('<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item: ' + item + '</p>');

         return item;
        }
    </script>
</head>
<body>
    <p>-Simple localStorage test-</p>
    <div id="stuff"></div>
</body>
</html>

源代码 在这里可获取


记录在日志中的异常是什么? - CommonsWare
抱歉,这里缺少具体的内容,请在问题中添加详细的信息。 - MrChaz
很奇怪。如果你有一个完整的示例项目可以打包上传到某个地方,我想看一下。 - CommonsWare
完成了,我注意到在4.0的更改日志中潜藏着这个:“WebKit更新到版本534.30”。 - MrChaz
从4.1版本开始,我的应用程序中似乎已经解决了这个问题。4.0.3不起作用。 - Ostkontentitan
显示剩余3条评论
2个回答

12

通过与谷歌工程师的一些讨论,他们似乎已经做出了将file://方案视为不安全的决定。

一个解决办法是执行以下操作:

browser.loadDataWithBaseURL("http://www.example.com", 
            htmlContent, 
            "text/html", 
            "utf-8", 
            null);

非常感谢您的回答,它也解决了我关于Uncaught Error: SECURITY_ERR: DOM Exception 18:2的疑问。 - Pravinsingh Waghela

4

对于Android 4.4以前的版本,在将数据作为一个目录使用文件方案加载到WebView时:

browser.loadDataWithBaseUrl("file:///android_asset/", html, "text/html", "UTF-8", null);

不会与localStorage一起使用。如果我添加文件名,则它可以在旧的操作系统版本上工作。

browser.loadDataWithBaseUrl("file:///android_asset/test.html", html, "text/html", "UTF-8", null);

难以置信... 在我的情况下,该应用程序使用API 12来运行,因为Android 3.1没有将setAllowUniversalAccessFromFileURLs(https://dev59.com/w3fZa4cB1Zd3GeqPYfx7)设置为true,所以在4.2上出现了空白页面。现在一切都好了。 - Karl Heinz Brehme Arredondo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接