it-swarm.com.de

Android webview & localStorage

Ich habe ein Problem mit einer Webansicht, die über eine HTML5 - App auf den localStorage zugreifen kann. Die Datei test.html informiert mich darüber, dass der lokale Speicher von meinem Browser nicht unterstützt wird (z. B. der webview). 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; 
    } 
}
} 
222
Thomas

Folgendes fehlte:

settings.setDomStorageEnabled(true);
479
Thomas

setDatabasePath () Methode wurde in API-Ebene 19 verworfen. Ich rate Ihnen, 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/");
}
43
mr.boyfox

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

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

Eine Lösung, die auf meinem Android 4.2.2, kompiliert mit Build Target 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

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

Wenn Sie dieselben Daten in mehreren Webviews gemeinsam nutzen möchten, können Sie sie nur mit einer Java -Datenbank und einer Javascript-Schnittstelle reparieren.

Diese Seite auf Github zeigt, wie das geht.

ich hoffe das hilft!

3

wenn Sie mehrere Webansichten haben, funktioniert localstorage nicht richtig.
zwei vorschläge:

  1. verwenden von Java database statt 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 "key: value" gespeichert. Sie können die eindeutige ID Ihres Browsers zu seinem Schlüssel hinzufügen und den normalen Android localstorage) verwenden
0
MHP