Android Webview和LocalStorage


242

我有一个Webview问题,该Webview可能通过HTML5应用程序访问localStorage 。test.html文件告诉我,我的浏览器(即webview)不支持本地存储。如果您有任何建议。

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

Answers:


516

缺少以下内容:

settings.setDomStorageEnabled(true);

1
同样:)非常感谢。我还必须确保您至少将Android 2.1定位为目标:在清单中添加android:minSdkVersion =“ 7”并将Project Build Target(在eclipse中)更改为至少2.1。
danmux 2011年

45

setDatabasePath()方法在API级别19中已弃用。我建议您像这样使用存储区域设置:

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/");
}

1
@Ram swaroop也许只需使用setDomStorageEnabled(true)即可​​为您启用本地存储也许您使用的是最新版本的android和设备,而您还没有出现此问题?(也许只需使用setDomStorageEnabled(true)即可​​为您启用本地存储),但是某些版本的android(例如Exm:旧)在应用程序重新启动后使用本地存储的问题会丢失此本地存储。有人出现了这个问题,他们投票赞成我的答案。如果您有任何想法,也可以添加另一个答案。
mr.boyfox

我尝试使用您的解决方案,但在应用程序被终止/重新启动后,localStorage仍然无法持久运行,但有时在多次重新启动后,localStorage恢复工作,并且已正确检索到那里存储的数据。这是不寻常的,但在我的情况下会发生。(在Sony Xperia SP上测试)
Ram Patra 2014年

@Ramswaroop我正在使用Nexus4,本地存储也没有问题。但是,当我在Samsung Galaxy SII上进行测试时,出现了此问题。我并不是说所有设备都在工作,只是有些设备具备了它。
mr.boyfox

25

重新启动应用程序后,我也遇到了数据丢失的问题。添加此帮助:

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

它解决了数据丢失问题,但这是什么?详细点吗?
索林·科曼内斯库

从API描述:“为了使数据库存储API来函数正确,这种方法必须使用到该应用程序可以编写一个路径称为”。developer.android.com/reference/android/webkit/...
iTake

15

适用于我的Android 4.2.2的解决方案,已使用构建目标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());
}

4

如果您的应用使用多个Web视图,您仍然会遇到麻烦:在所有Web视图之间未正确共享localStorage。

如果要在多个Web视图中共享相同的数据,唯一的方法是使用Java数据库和JavaScript界面​​对其进行修复。

github上的此页面显示了如何执行此操作。

希望对您有所帮助!


嗨!我们围绕此localStorage修复程序以及其他一些针对混合应用程序的出色工具构建了一个工具:cobalt,这是一个用于构建具有多个Web视图的应用程序的开源框架。我们增强了localStorage并添加了一个pubsub插件来在Web视图之间“对话”。看看cobaltians.org
Guillaume Gendre

谢谢。我的老板也问了同样的问题。这有帮助。
hsu.tw

0

如果您有多个Web视图,则localstorage无法正常工作。
两个建议:

  1. 使用Java数据库而不是解释“ @Guillaume Gendre”的webview localstorage。(当然,它对我不起作用)
  2. 本地存储工作类似于json,因此值存储为“ key:value”。您可以将浏览器的唯一ID添加到它的键中,并使用常规的android localstorage

嗨!我们还构建了一个工具:cobalt一个开放源码框架,用于构建具有多个Web视图的应用程序。我们增强了localStorage并添加了一个pubsub插件来在Web视图之间“对话”。(cobaltians.org
纪尧姆·根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.