2011-12-05 14 views
16

私はLocalStorageを使ってデータを表示/保存/再表示する簡単なhtml5テストページを持っています。Android 4.0.1では、WebView HTML 5ローカルストレージが壊れていますか?

このコードは、Android 2.3.x以降で完璧に動作しますが、ログ延期localStorage.getItem()コールとJSが停止し、この時点であるHTMLのライン18上の4.0.1で例外。

例外: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> 

利用可能なソースhere

+0

ログに記録される例外は何ですか? – CommonsWare

+0

申し訳ありませんが、それは役に立ちます - 質問に追加 – MrChaz

+0

それは奇妙です。パッケージ化してどこかにアップロードできる完全なサンプルプロジェクトがあれば、それを見てみたいと思います。 – CommonsWare

答えて

11

彼らがその決定を行ったと思われ、Googleのエンジニアといくつかの議論を経てfile:// schemeは安全ではありません。

このため周りの作業はディレクトリとして、ファイル・スキームとのWebViewに、データのロードを4.4未満のアンドロイドのバージョンについては、次の

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

ありがとう!私はあなたを愛しています<3 – Aballano

+0

答えにたくさんのおかげで、それはまた、キャッチエラー:SECURITY_ERR:DOM例外18:2の私のクエリを解決しました。 –

4

を行うことです。

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

文句を言わない仕事localStorageを使用します。ファイル名を追加すると、古いOSバージョンで動作します

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

信じられない... 私の状況では、アプリケーションは、setAllowUniversalAccessFromFileURLs(http://stackoverflow.com/questions/19379392/jquery-mobile-not-working-in- webview-when-load-from-local-assets)をtrueに設定すると、4.2の空白ページが表示されます。これですべてOKです。 –

関連する問題