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

Android 安卓4.0.1破坏WebView HTML 5本地存储?,android,html,jquery-mobile,webview,local-storage,Android,Html,Jquery Mobile,Webview,Local Storage,我有一个简单的html5测试页面,它使用LocalStorage来显示/保存/重新显示一段数据 这段代码在Android 2.3.x中运行得非常好,但在html的第18行记录了一个异常,这是第一个localStorage.getItem()调用,此时JS停止 异常:Uncaught错误:安全错误:DOM异常18位于/data/data/my.app.name/app\u htmlData:18 我还尝试将数据库路径设置为getCacheDir(),结果相同 String htmlContent

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

这段代码在Android 2.3.x中运行得非常好,但在html的第18行记录了一个异常,这是第一个
localStorage.getItem()
调用,此时JS停止

异常:
Uncaught错误:安全错误:DOM异常18位于/data/data/my.app.name/app\u 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>

简单本地存储测试
函数doTest(){
$(“#stuff”).append(“reading

”); var item=read(); $(“#stuff”).append(“writing

”); localStorage['bar']=新日期().ToutString(); $('stuff')。追加('p>再次阅读

'); read(); } 函数read(){ var item=localStorage.getItem('bar'); if(item==null | |(item==未定义)){ 项目=''; } $(“#stuff”).append(“项:”+item+”

); 退货项目; } -简单本地存储测试-


来源可用

通过与谷歌工程师的讨论,他们似乎已经决定文件://scheme不安全

解决这一问题的方法是执行以下操作

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

对于低于4.4的android版本,将数据加载到具有文件方案作为目录的webview中:

browser.loadDataWithBaseUrl("file:///android_asset/", html, "text/html", "UTF-8", null);
无法使用本地存储。如果我添加了一个文件名,它在较旧的操作系统版本上确实可以工作

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

记录的异常是什么?抱歉,这会很有用-添加到问题中,这很奇怪。如果你有一个完整的示例项目,你可以打包并上传到某个地方,我想看一下。完成后,我注意到在4.0更改日志中隐藏着这样的内容:“WebKit更新到534.30版”我看到了你看到的内容,除了这个问题,我没有其他解释:非常感谢你的回答,它还解决了我对未捕获错误的查询:SECURITY\u ERR:DOM Exception 18:2。难以置信。。。在我的情况下,该应用程序使用的是API 12,从Android 3.1开始运行,而Android 3.1没有将AllowUniversalAccessFromFileUrls()设置为true,因此,4.2上的空白页。现在一切都好了。