Android webview和localStorage

Tho*_*mas 230 html5 android webview local-storage

我有一个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; 
    } 
}
} 
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 493

缺少以下内容:

settings.setDomStorageEnabled(true);
Run Code Online (Sandbox Code Playgroud)

  • 一样:) 非常感谢。我还必须确保您的目标至少是 Android 2.1 以上:将 android:minSdkVersion="7" 添加到您的清单并将项目构建目标(在 eclipse 中)更改为至少 2.1。 (2认同)

mr.*_*fox 43

在API级别19中不推荐使用setDatabasePath()方法.我建议您使用这样的存储区域设置:

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/");
}
Run Code Online (Sandbox Code Playgroud)

  • @Ram swaroop也许只要使用setDomStorageEnabled(true)来启用本地存储就足够了也许您使用最新版本的android和设备,并且这个问题还没有出现在您身上,对吗?(也许只需使用 setDomStorageEnabled (true) 来启用本地存储就足够了),但是某些版本的 android(例如:旧)在应用程序重新启动后使用本地存储时会出现问题,丢失了此区域设置存储。有人出现了这个问题,他们对我的答案进行了投票。如果您有任何想法,也可以添加另一个答案。 (2认同)

iTa*_*ake 24

重启应用程序后,我也遇到了丢失数据的问题.添加这有助于:

webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
Run Code Online (Sandbox Code Playgroud)


小智 14

适用于我的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());
}
Run Code Online (Sandbox Code Playgroud)


Gui*_*dre 5

如果您的应用程序使用多个 webview,您仍然会遇到问题:localStorage 未在所有 webview 中正确共享。

如果你想在多个 webviews 中共享相同的数据,唯一的方法是使用 java 数据库和 javascript 接口修复它。

github 上的这个页面展示了如何做到这一点。

希望这有帮助!


kel*_*vin 5

最近当我寻找类似的解决方案时,这篇文章出现了很多。自 API 19 起, webview WebSettings 对象已弃用数据库路径方法,这些方法现在返回空白值,这意味着无论我们在加载 URL 之前是否在设置上启用它,我们都不能依赖它们来提取网页存储。

为了从网页读取 localStorage 值,我们需要扩展WebViewClient()和 override onPageFinished(),您可以在其中评估 webview 上的 javascript,如下所示:

const val JAVASCRIPT_LOCAL_STORAGE_LOOKUP = "javascript:window.localStorage.getItem('KEY');"

...

override fun onPageFinished(view: WebView?, url: String?) {
    super.onPageFinished(view, url)
    view?.let { webView ->
        webView.evaluateJavascript(JAVASCRIPT_LOCAL_STORAGE_LOOKUP) { result ->
            // returns value from 'KEY'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只需替换'KEY'为您要访问的存储对象的密钥即可。这样就无需提供任何可能与您已有的数据库实现发生冲突的数据库实现。请注意,这只会从 webview 刚刚完成加载的域中轮询 localStorage。我希望这对其他人有帮助,因为我花了一些时间才弄清楚。