Android webview & localStorage

新手上路,请多包涵

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

原文由 Thomas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 574
2 个回答

缺少以下内容:

 settings.setDomStorageEnabled(true);

原文由 Thomas 发布,翻译遵循 CC BY-SA 3.0 许可协议

我有一个更好的解决方案,它将在第一次打开 WebView 时起作用。

你只需要使用自定义回调。像这样

public interface DataSavedCallback {
  void onDataSaved();
}

然后使用这个函数从webview本地存储中获取key的值

    public static void getLocalStorageAndSaveOnAndroidPref(String[] keys,
WebView view,dataSavedCallback savedCallback) {

    String JAVASCRIPT_LOCAL_STORAGE_LOOKUP = "javascript:window";
     view.evaluateJavascript(JAVASCRIPT_LOCAL_STORAGE_LOOKUP.concat(".localStorage.getItem('" + keys[i] + "')"), new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    Log.d(TAG, "getLocalStorageAndSaveOnAndroidPref: " + value);
                }
            });

    }

您可以使用 webview 在任何地方调用上述函数

myWebView.post(() -> {
            String[] keys = {"androidDeliveryAppStickyNotificationTitle","androidDeliveryAppStickyNotificationSubtitle","androidAppNewSoundAlertTitle"};
            getLocalStorageAndSaveOnAndroidPref(keys, myWebView, new dataSavedCallback() {
                @Override
                public void onDataSaved() {
                //do whatever you want
                }
            });

        });

原文由 Manish 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题