2011-05-05 86 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()); 
}