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)
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)
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)
最近当我寻找类似的解决方案时,这篇文章出现了很多。自 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。我希望这对其他人有帮助,因为我花了一些时间才弄清楚。
| 归档时间: |
|
| 查看次数: |
115381 次 |
| 最近记录: |