Android Webview & localStorage

242

Ich habe ein Problem mit einer Webansicht, die möglicherweise über eine HTML5App auf den localStorage zugreift . Die Datei test.html informiert mich darüber, dass der lokale Speicher von meinem Browser (dh dem webview) nicht unterstützt wird. Wenn Sie einen Vorschlag haben ..

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
quelle

Antworten:

517

Folgendes fehlte:

settings.setDomStorageEnabled(true);
Thomas
quelle
1
gleich :) vielen dank. Ich musste auch sicherstellen, dass Sie mindestens auf Android 2.1 abzielen: Fügen Sie Ihrem Manifest android: minSdkVersion = "7" hinzu und ändern Sie das Project Build-Ziel (in Eclipse) auf mindestens 2.1.
Danmux
45

Die Methode setDatabasePath () wurde in API-Ebene 19 nicht mehr unterstützt. Ich empfehle Ihnen, das Speichergebietsschema wie folgt zu verwenden:

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
quelle
1
@Ram swaroop Vielleicht reicht es einfach, setDomStorageEnabled (true) zu verwenden, um den lokalen Speicher für Sie zu aktivieren. Vielleicht verwenden Sie die letzte Version von Android und Gerät, und dieses Problem ist bei Ihnen nicht aufgetreten, oder? (Vielleicht genug, verwenden Sie einfach setDomStorageEnabled (true), um den lokalen Speicher für Sie zu aktivieren), aber einige Versionen von Android (Beispiel: alt) haben Probleme beim Verwenden des lokalen Speichers, nachdem die Anwendung neu gestartet wurde, haben diesen Speicherort verloren. Jemand hat dieses Problem festgestellt und sie stimmen meiner Antwort zu. Wenn Sie eine Idee haben, können Sie auch eine andere Antwort hinzufügen.
Mr. Boyfox
Ich habe es mit Ihrer Lösung versucht, aber der localStorage bleibt nach dem Beenden / Neustarten der App nicht bestehen, aber manchmal funktioniert der localStorage nach vielen Neustarts wieder und die dort gespeicherten Daten werden korrekt abgerufen. Dies ist ungewöhnlich, aber es passiert in meinem Fall. (Getestet auf Sony Xperia SP)
Ram Patra
@ Ramswaroop Ich verwende Nexus4 und habe auch kein Problem mit dem lokalen Speicher. Aber als ich auf dem Samsung Galaxy SII getestet habe, gab es dieses Problem. Ich sage nicht, dass alle Geräte so funktionieren, nur einige Geräte haben es.
mr.boyfox
25

Ich hatte auch Probleme mit Datenverlust nach dem Neustart der Anwendung. Das Hinzufügen hat geholfen:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
ich nehme
quelle
Es hat das Datenverlustproblem gelöst, aber was ist das? Ein bisschen ausarbeiten?
Sorin Comanescu
aus der API-Beschreibung: "Damit die Datenbankspeicher-API ordnungsgemäß funktioniert, muss diese Methode mit einem Pfad aufgerufen werden, in den die Anwendung schreiben kann." developer.android.com/reference/android/webkit/…
iTake
15

Eine Lösung, die auf meinem Android 4.2.2 funktioniert und mit dem Build-Ziel Android 4.4W kompiliert wurde:

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
quelle
4

Wenn Ihre App mehrere Webansichten verwendet, treten weiterhin Probleme auf: localStorage wird nicht in allen Webansichten korrekt freigegeben.

Wenn Sie dieselben Daten in mehreren Webansichten freigeben möchten, können Sie sie nur mit einer Java-Datenbank und einer Javascript-Oberfläche reparieren.

Diese Seite auf Github zeigt, wie das geht.

Ich hoffe das hilft!

Guillaume Gendre
quelle
Hallo! Wir haben ein Tool um dieses localStorage-Update und einige andere coole Dinge für Hybrid-Apps erstellt: Cobalt, ein Open-Source-Framework zum Erstellen von Apps mit mehreren Webansichten. Wir haben localStorage erweitert und ein Pubsub-Plugin hinzugefügt, um zwischen Webansichten zu "sprechen". Werfen Sie
Guillaume Gendre
VIELEN DANK. Mein Chef hat gerade die gleiche Frage gestellt. Diese Hilfe.
hsu.tw
0

Wenn Sie mehrere Webansichten haben, funktioniert localstorage nicht richtig.
zwei Vorschläge:

  1. Verwenden Sie stattdessen die Java-Datenbank webview localstorage, das "@Guillaume Gendre" erklärt hat (natürlich funktioniert es bei mir nicht).
  2. Der lokale Speicher funktioniert wie json, daher werden die Werte als "Schlüssel: Wert" gespeichert. Sie können die eindeutige ID Ihres Browsers zu seinem Schlüssel hinzufügen und den normalen lokalen Android-Speicher verwenden
MHP
quelle
Hallo! Wir haben auch ein Tool erstellt: Cobalt, ein Open-Source-Framework zum Erstellen von Apps mit mehreren Webansichten. Wir haben localStorage erweitert und ein Pubsub-Plugin hinzugefügt, um zwischen Webansichten zu "sprechen". ( cobaltians.org )
Guillaume Gendre