我有一个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; 
        } 
    }
}

当前回答

一个解决方案,工作在我的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());
}

其他回答

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

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

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

希望这对你有所帮助!

一个解决方案,工作在我的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());
}

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/");
}

如果你有多个webview, localstorage不能正常工作。 两个建议:

“@Guillaume Gendre”解释说,使用java数据库代替webview localstorage。(当然对我没用) 本地存储工作类似于json,所以值存储为"key:value" .你可以添加你的浏览器唯一id到它的键和使用正常的android localstorage

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

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

public interface DataSavedCallback {
  void onDataSaved();
}

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

    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
                }
            });

        });