web-dev-qa-db-fra.com

Android WebView & Stockage local

J'ai un problème avec une vue Web qui peut accéder au localStorage par une application HTML5. Le fichier test.html m’informe que la mémoire de stockage locale n’est pas prise en charge par mon navigateur (c.-à-d. Le webview). Si vous avez une suggestion ..

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

Il manquait ce qui suit:

settings.setDomStorageEnabled(true);
479
Thomas

setDatabasePath () Cette méthode est obsolète dans l'API de niveau 19. Je vous conseille d'utiliser les paramètres régionaux de stockage comme ceci:

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/");
}
43
mr.boyfox

J'ai également eu un problème de perte de données après le redémarrage de l'application. Ajouter ceci a aidé:

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

Une solution qui fonctionne sur mon Android 4.2.2, compilée avec la cible de construction 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());
}
14
AngryWolf

Si votre application utilise plusieurs vues Web, vous aurez toujours des problèmes: localStorage n'est pas correctement partagé entre toutes les vues Web.

Si vous souhaitez partager les mêmes données dans plusieurs vues Web, le seul moyen est de les réparer avec une base de données Java et une interface javascript.

Cette page sur github montre comment faire cela.

espérons cette aide!

3
Guillaume Gendre

si vous avez plusieurs vues Web, le stockage local ne fonctionne pas correctement.
Deux suggestions:

  1. en utilisant Java base de données à la place de webview localstorage que "@Guillaume Gendre" a expliqué. (Bien sûr, cela ne fonctionne pas pour moi)
  2. le stockage local fonctionne comme json, donc les valeurs sont stockées sous la forme "clé: valeur". vous pouvez ajouter un identifiant unique de votre navigateur à sa clé et en utilisant Android localstorage normal
0
MHP