2011-12-05 15 views
16

Mam prostą stronę testową HTML5, która używa LocalStorage do wyświetlania/zapisywania/wyświetlania na ekranie danych.Android 4.0.1 łamie lokalną pamięć WebView HTML 5?

Ten kod działa doskonale w Android 2.3.x ale kłody wyjątek w 4.0.1 na linii 18 html, który jest wywołanie Frist localStorage.getItem() i w tym momencie JS przystanków.

Wyjątek: Uncaught Error: SECURITY_ERR: DOM Exception 18 at /data/data/my.app.name/app_htmlData:18 Próbowałem również ustawić ścieżkę bazy danych na getCacheDir() z tym samym wynikiem.

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 że strona jest świadczenie jest następujący:

<!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> 

źródłowy dostępny here

+0

Co to jest wyjątek, który jest rejestrowany? – CommonsWare

+0

Przykro nam, to byłoby przydatne - dodano do pytania – MrChaz

+0

To dziwne. Jeśli masz kompletny przykładowy projekt, możesz go spakować i przesłać gdzieś, chciałbym go obejrzeć. – CommonsWare

Odpowiedz

11

Via jakiejś dyskusji z Google inżynier wydaje, że już podjął decyzję, że Plik: // schemat jest niezabezpieczony.

Dzieło wokół tego jest to, aby wykonać następujące czynności

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

Dzięki! Kocham cię <3 – Aballano

+0

Bardzo dziękuję za odpowiedź, również rozwiązałam moje pytania: Uncaught Error: SECURITY_ERR: DOM Exception 18: 2. –

4

dla Androida wersjach mniej niż 4,4, ładowanie danych w WebView z systemem plików jako katalogu:

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

przyzwyczajenie praca z localStorage. Jeśli dodaję nazwę pliku, działa ona w starszych wersjach systemu:

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

Niewiarygodne ... W mojej sytuacji aplikacja używa interfejsu API 12, który działa od wersji Androida 3.1, która nie ma ustawionych w interfejsie użytkownikaAllowUniversalAccessFromFileURL (http://stackoverflow.com/questions/19379392/jquery-mobile-not-working-in- webview-when-loading-from-local-assets), aby ustawić na true, czyli pustą stronę w 4.2. Teraz wszystko w porządku. –