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; 
    } 
}
} 
Thomas
fuente

Respuestas:

518

Faltaba lo siguiente:

settings.setDomStorageEnabled(true);
Thomas
fuente
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/");
}
mr.boyfox
fuente
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/");
tomo
fuente
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());
}
AngryWolf
fuente
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!

Guillaume Gendre
fuente
¡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
MHP
fuente
¡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