Webview de Android y almacenamiento local


242

Tengo un problema con una vista web que puede acceder al almacenamiento local mediante una HTML5aplicación. El archivo test.html me informa que mi navegador no admite el almacenamiento local (es decir, el webview). Si tienes alguna sugerencia ...

package com.test.HelloWebView; 
import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebStorage; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
public class HelloWebView extends Activity { 
WebView webview; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    webview = (WebView) findViewById(R.id.webview); 
    webview.getSettings().setJavaScriptEnabled(true); 
    webview.setWebViewClient(new HelloWebViewClient()); 
    webview.loadUrl("file:///android_asset/test.html"); 
    WebSettings settings = webview.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    settings.setDatabaseEnabled(true); 
    String databasePath = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath(); 
    settings.setDatabasePath(databasePath);
    webview.setWebChromeClient(new WebChromeClient() { 
    public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota, long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 
            quotaUpdater.updateQuota(5 * 1024 * 1024); 
        } 
    }); 
} 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) { 
        webview.goBack(); 
        return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
private class HelloWebViewClient extends WebViewClient { 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
    } 
}
} 

Respuestas:


518

Faltaba lo siguiente:

settings.setDomStorageEnabled(true);

1
mismo :) muchas gracias. También tuve que asegurarme de que apunta al menos Android 2.1 en adelante: agregue android: minSdkVersion = "7" a su manifiesto y cambie el Objetivo de compilación del proyecto (en eclipse) para que sea 2.1 al menos.
danmux

45

El método setDatabasePath () quedó en desuso en el nivel 19 de API. Le recomiendo que use la configuración regional de almacenamiento de esta manera:

webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setDatabaseEnabled(true);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
}

1
@Ram swaroop Tal vez lo suficiente solo use setDomStorageEnabled (verdadero) para habilitar el almacenamiento local para usted Tal vez use la última versión de Android y dispositivo, y este problema no ha surgido en su caso, ¿verdad? (Tal vez lo suficiente solo use setDomStorageEnabled (verdadero) para habilitar el almacenamiento local), pero algunas versiones del problema de Android (Exm: antiguo) al usar el almacenamiento local después del reinicio de la aplicación perdieron este almacenamiento local. Alguien apareció este problema y votan por mi respuesta. Si tiene alguna idea, también puede agregar otra respuesta.
mr.boyfox

Intenté con su solución, pero aún así localStorage no persiste después de que la aplicación se apaga / reinicia, pero a veces después de muchos reinicios, localStorage continúa funcionando y los datos que se habían almacenado allí se recuperan correctamente. Esto es inusual, pero sucede en mi caso. (Probado en Sony Xperia SP)
Ram Patra

@Ramswaroop Estoy usando Nexus4 y tampoco tengo ningún problema con el almacenamiento local. Pero cuando probé en el Samsung Galaxy SII hubo este problema. No digo que todos los dispositivos funcionen, solo algunos dispositivos lo tienen.
mr.boyfox

25

También tuve problemas con la pérdida de datos después de reiniciar la aplicación. Agregar esto ayudó:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");

Se resolvió el problema de pérdida de datos, pero ¿qué es esto? ¿Elaborar un poco?
Sorin Comanescu

de la descripción de la API: "Para que la API de almacenamiento de la base de datos funcione correctamente, este método debe llamarse con una ruta en la que la aplicación pueda escribir". developer.android.com/reference/android/webkit/…
iTake

15

Una solución que funciona en mi Android 4.2.2, compilada con el objetivo de compilación de Android 4.4W:

WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    File databasePath = getDatabasePath("yourDbName");
    settings.setDatabasePath(databasePath.getPath());
}

4

Si su aplicación usa múltiples vistas web, todavía tendrá problemas: localStorage no se comparte correctamente en todas las vistas web.

Si desea compartir los mismos datos en múltiples vistas web, la única forma es repararla con una base de datos java y una interfaz javascript.

Esta página en github muestra cómo hacer esto.

¡espero que esto ayude!


¡Hola! creamos una herramienta en torno a esta solución de almacenamiento local y algunas otras cosas interesantes para aplicaciones híbridas: cobalto, un marco de código abierto para crear aplicaciones con múltiples vistas web. Mejoramos localStorage y agregamos un complemento pubsub para "hablar" entre vistas web. echa un vistazo a cobaltians.org
Guillaume Gendre

GRACIAS. Mi jefe acaba de hacer la misma pregunta. Esta ayuda
hsu.tw

0

Si tiene varias vistas web, el almacenamiento local no funciona correctamente.
dos sugerencias:

  1. usando la base de datos de Java en lugar de webview localstorage que "@Guillaume Gendre" explicó (por supuesto, no funciona para mí)
  2. el almacenamiento local funciona como json, por lo que los valores se almacenan como "clave: valor". Puede agregar la identificación única de su navegador a su clave y usar el almacenamiento local de Android normal

¡Hola! También creamos una herramienta: cobalto, un marco de código abierto para crear aplicaciones con múltiples vistas web. Mejoramos localStorage y agregamos un complemento pubsub para "hablar" entre vistas web. ( cobaltians.org )
Guillaume Gendre
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.