2011-12-05 15 views
16

Tengo una página de prueba html5 simple que utiliza LocalStorage para mostrar/guardar/volver a mostrar una pieza de datos.Android 4.0.1 rompe el almacenamiento local de WebView HTML 5?

Este código funciona perfectamente en Android 2.3.x pero registros una excepción en 4.0.1 en la línea 18 del html que es la llamada Frist localStorage.getItem() y en este punto se detiene la JS.

Excepción: Uncaught Error: SECURITY_ERR: DOM Exception 18 at /data/data/my.app.name/app_htmlData:18 También he intentado establecer la ruta a la base de datos getCacheDir() con el mismo resultado.

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

El HTML que la página es la prestación es el siguiente:

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

fuente disponible here

+0

¿Cuál es la excepción que se registra? – CommonsWare

+0

Disculpe, eso sería útil, se agregó a la pregunta – MrChaz

+0

Eso es extraño. Si tiene un proyecto de muestra completo, puede empaquetar y cargar en algún lugar, me gustaría echarle un vistazo. – CommonsWare

Respuesta

11

a través de alguna discusión con un ingeniero de Google parece que se haya tomado la decisión de que la file: // scheme es inseguro.

Una forma de solucionar esto es hacer lo siguiente

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

¡Gracias! Te amo <3 – Aballano

+0

muchas gracias por la respuesta, sino que también ha resuelto mis consultas de error no detectada: SECURITY_ERR: DOM Excepción 18: 2. –

4

Para las versiones de Android de menos de 4,4, cargar datos en una vista web con un sistema de archivos como un directorio:

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

no funcionará con localStorage. Si agrego un nombre de archivo, funciona en versiones anteriores del sistema operativo

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

increíble ... En mi situación, la aplicación es el uso de la API 12, para ejecutar Android 3.1 ya que no tiene setAllowUniversalAccessFromFileURLs (http://stackoverflow.com/questions/19379392/jquery-mobile-not-working-in- webview-when-loading-from-local-assets) para establecerlo en verdadero, por lo tanto, página en blanco en 4.2. Con eso ahora todo está bien. –

Cuestiones relacionadas