2011-12-05 6 views
16

Ho una semplice pagina di test html5 che utilizza LocalStorage per visualizzare/salvare/visualizzare nuovamente un dato.Android 4.0.1 interrompe la memorizzazione locale HTML 5 di WebView?

Questo codice funziona perfettamente in 2.3.x Android, ma tronchi un'eccezione in 4.0.1 on line 18 della html che è la chiamata Frist localStorage.getItem() ed a questo punto il JS si ferma.

Eccezione: Uncaught Error: SECURITY_ERR: DOM Exception 18 at /data/data/my.app.name/app_htmlData:18 Ho anche provato a impostare il percorso del database su getCacheDir() con lo stesso risultato.

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

Il codice HTML che la pagina viene eseguito il rendering è la seguente:

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

sorgente disponibile here

+0

Qual è l'eccezione che viene registrata? – CommonsWare

+0

Siamo spiacenti, sarebbe utile - aggiunto alla domanda – MrChaz

+0

È strano. Se hai un progetto di esempio completo che potresti impacchettare e caricare da qualche parte, mi piacerebbe dargli un'occhiata. – CommonsWare

risposta

11

Via qualche discussione con un Google ingegnere sembra che hanno preso la decisione che la file: // schema non è sicuro.

un lavoro in giro per questo è di fare quanto segue

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

Grazie! Ti amo <3 – Aballano

+0

Grazie mille per la risposta, ha anche risolto le mie domande su Uncaught Error: SECURITY_ERR: DOM Exception 18: 2. –

4

Per le versioni di Android a meno di 4,4, il caricamento dei dati in una visualizzazione web con un sistema di file come una directory:

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

abituato lavoro con localStorage. Se aggiungo un nome file funziona su versioni precedenti del sistema operativo

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

Incredibile ... Sulla mia situazione, l'app utilizza l'API 12, da eseguire dopo Android 3.1 che non ha setAllowUniversalAccessFromFileURLs (http://stackoverflow.com/questions/19379392/jquery-mobile-not-working-in- webview-when-loading-from-local-assets) per impostare su true, quindi, pagina vuota su 4.2. Con quello ora va tutto bene. –