2011-05-05 40 views
181

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

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

感谢您编写格式良好的问题。 – 2011-05-09 10:36:16

+4

@Sheikh阿曼:那么他值得投票=) – 2011-05-10 07:00:27

回答

390

以下缺失:

settings.setDomStorageEnabled(true); 
+1

谢谢。现在我可以回去工作了!有一个upvote。 – 2011-10-19 20:06:28

+1

相同:)非常感谢。我还必须确保你的目标至少是Android 2.1以上版本:将android:minSdkVersion =“7”添加到清单中,并将Project Build Target(在eclipse中)更改为2.1。 – danmux 2011-11-19 18:49:30

+0

+1现在是相同的情况! – zaf 2012-02-15 12:47:06

21

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

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

它解决了数据丢失问题,但这是什么?详细一点? – 2013-10-01 21:21:51

+0

来自API描述: “为了使数据库存储API正常工作,必须使用应用程序可写入的路径调用此方法。” http://developer.android.com/reference/android/webkit /WebSettings.html#setDatabasePath(java.lang.String) – iTake 2013-10-02 06:45:19

3

如果您的应用程序使用多个网页流量,你仍然有烦恼:localStorage的不正确翻过所有网页视图共享。

如果您想在多个网页浏览中共享相同的数据,唯一的方法是使用java数据库和javascript界面​​进行修复。

This page在github上显示了如何做到这一点。

希望对您有所帮助!

+0

嗨!我们围绕这个localStorage修复和其他一些适用于混合应用的很酷的东西构建了一个工具:钴,一个用于构建具有多个Web视图的应用的开源框架。我们增强了localStorage并添加了一个pubsub插件来在webviews之间“交谈”。看看http:// cobaltians。org – 2016-02-10 08:21:33

33

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:old)问题会丢失本地存储。有人出现这个问题,他们投票给我的答案。如果您有任何想法,也可以添加其他答案。 – 2014-06-17 05:18:48

+0

我试着用你的解决方案,但仍然localStorage不会在应用程序被终止/重新启动后持续存在,但有时在多次重新启动后localStorage会恢复工作,并且已经存储在那里的数据被正确检索。这是不寻常的,但它发生在我的情况。(测试在索尼Xperia SP) – 2014-06-18 08:38:37

+0

@Ramswaroop我使用Nexus4,我也没有与本地存储的问题。但是当我在三星Galaxy SII上测试时,出现了这个问题。我并不是说所有设备都能正常工作,只需要一些设备就可以了。 – 2014-06-18 12:20:14

0

如果你有多个web视图,localStorage的工作不正常。
二点建议:用java数据库,而不是网页流量的localStorage说,“@Guillaume Gendre解释说:”

  1. (当然它不工作对我来说)
  2. 本地存储工作像JSON,所以值存储为“关键:值”。您可以将您的浏览器唯一ID,以它的密钥,并使用Android的正常的localStorage
+0

嗨!我们还构建了一个工具:钴开源框架,用于构建具有多个Web视图的应用程序。我们增强了localStorage并添加了一个pubsub插件来在webviews之间“交谈”。 (http://cobaltians.org) – 2016-02-10 08:20:27

9

,关于我的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()); 
}