android html5 jquery-mobile webview local-storage
aquí

Android 4.0.1 rompe el almacenamiento local de WebView HTML 5?



html5 jquery-mobile (2)

A través de una conversación con un ingeniero de Google, parece que han tomado la decisión de que el esquema file: // es inseguro.

Una solución para esto es hacer lo siguiente

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

Tengo una página de prueba html5 simple que utiliza LocalStorage para mostrar / guardar / volver a mostrar una parte de los datos.

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

Excepción: Uncaught Error: SECURITY_ERR: DOM Exception 18 at /data/data/my.app.name/app_htmlData:18 También intenté establecer la ruta de la base de datos a 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 está representando la página 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 aquí


Para versiones de Android menores que 4.4, cargando datos en una vista web con un esquema de archivo como 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);