Affichage Web Android et stockage local

242

J'ai un problème avec une vue Web qui peut accéder au localStorage par une HTML5application. Le fichier test.html m'informe que le stockage local n'est pas pris en charge par mon navigateur (c'est-à-dire le webview). Si vous avez des suggestions ..

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
la source

Réponses:

518

Il manquait ce qui suit:

settings.setDomStorageEnabled(true);
Thomas
la source
1
même :) merci beaucoup. Je devais également m'assurer que vous cibliez au moins Android 2.1 à partir de maintenant: ajoutez android: minSdkVersion = "7" à votre manifeste et changez la cible de construction du projet (dans eclipse) pour être au moins 2.1.
danmux
46

La méthode setDatabasePath () a été déconseillée au niveau de l'API 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/");
}
mr.boyfox
la source
1
@Ram swaroop Peut-être assez d'utiliser simplement setDomStorageEnabled (true) pour activer le stockage local pour vous Peut-être que vous utilisez la dernière version d'Android et de l'appareil, et que ce problème ne vous est pas venu à droite? (Peut-être assez, utilisez simplement setDomStorageEnabled (true) pour activer le stockage local pour vous), mais certaines versions d'Android (Exm: old) rencontrent des problèmes lors de l'utilisation du stockage local après le redémarrage de l'application et ont perdu ce stockage local. Quelqu'un est apparu ce problème et ils votent jusqu'à ma réponse. Si vous avez une idée, vous pouvez également ajouter une autre réponse.
mr.boyfox
J'ai essayé avec votre solution, mais le localStorage ne persiste pas après que l'application est tuée / redémarrée, mais parfois après de nombreux redémarrages, le localStorage reprend son travail et les données qui y étaient stockées sont correctement récupérées. C'est inhabituel mais cela arrive dans mon cas. (Testé sur Sony Xperia SP)
Ram Patra
@Ramswaroop J'utilise Nexus4 et je n'ai également aucun problème avec le stockage local. Mais quand j'ai testé sur le Samsung Galaxy SII, il y avait ce problème. Je ne dis pas que tous les appareils fonctionnent donc, seulement certains appareils l'ont.
mr.boyfox
25

J'ai également eu un problème avec la perte de données après le redémarrage de l'application. L'ajout de cela a aidé:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
Je prends
la source
Cela a résolu le problème de perte de données, mais qu'est-ce que c'est? Élaborer un peu?
Sorin Comanescu
à partir de la description de l'API: "Pour que l'API de stockage de base de données fonctionne correctement, cette méthode doit être appelée avec un chemin sur lequel l'application peut écrire." developer.android.com/reference/android/webkit/…
iTake
15

Une solution qui fonctionne sur mon Android 4.2.2, compilée avec la cible de build 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
la source
4

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

Si vous souhaitez partager les mêmes données dans plusieurs vues Web, la seule façon est de les réparer avec une base de données java et une interface javascript.

Cette page sur github montre comment procéder.

j'espère que cette aide!

Guillaume Gendre
la source
Salut! nous avons construit un outil autour de ce correctif localStorage et quelques autres trucs sympas pour les applications hybrides: cobalt, un framework open source pour créer des applications avec plusieurs vues Web. Nous avons amélioré localStorage et ajouté un plugin pubsub pour "parler" entre les vues Web. jetez un oeil sur cobaltians.org
Guillaume Gendre
THX. Mon patron vient de poser la même question. Cette aide.
hsu.tw
0

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

  1. en utilisant la base de données java à la place du stockage local webview 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 en tant que «clé: valeur» .vous pouvez ajouter l'identifiant unique de votre navigateur à sa clé et utiliser le stockage local Android normal
MHP
la source
Salut! nous avons également construit un outil: cobalt un framework open source pour la création d'applications avec plusieurs vues Web. Nous avons amélioré localStorage et ajouté un plugin pubsub pour "parler" entre les vues Web. ( cobaltians.org )
Guillaume Gendre