如何清除Android WebView的(CSS)访问历史记录?

Nap*_*ppy 15 css java android caching

我尝试通过清除前一个用户留下的任何私有数据来重用现有的WebView:

CookieManager.getInstance().removeAllCookie();
webview.clearHistory();
webview.clearFormData();
webview.clearCache(true);
Run Code Online (Sandbox Code Playgroud)

clearHistory 似乎只是清除可通过API访问的后退/前进列表,而不是用于着色Web内容中的链接的内部列表.

我甚至试过以下,另一个stackoverflow回答建议:

deleteDatabase("webview.db");
deleteDatabase("webviewCache.db");
Run Code Online (Sandbox Code Playgroud)

我仍然没有运气::visited重新加载页面后CSS 选择器仍然有效.

另一种方法是使用API​​级别11隐私浏览功能(新构造函数参数),但是我根本无法从访问过的链接中受益; 并且不能再针对旧版本.

也许有人有解决这个问题的方法?谢谢你的帮助.

到目前为止我得到的答案摘要:

我尝试了这两个答案,但第一个似乎是清除HTML5数据存储,后者似乎特定于内置浏览器:

WebStorage.getInstance().deleteAllData();
Browser.clearHistory(getContentResolver());
Run Code Online (Sandbox Code Playgroud)

WebChromeClient.getVisitedHistory(ValueCallback<String[]> callback) 仅在我第一次在最近安装的应用程序中创建新WebView后调用.

我试图WebView从视图层次中删除并创建一个新的,但不幸的是,访问历史似乎存储在整个应用程序中.

Tho*_*kis 3

覆盖 WebChromeClient 和 WebViewClient...该死的,它被隐藏了。

事实上,我必须深入挖掘才能找到这一点。

WebView webView = (WebView)findViewById(R.id.myWebView);
WebChromeClient myWebChromeClient = new WebChromeClient(){
        @Override
        public void getVisitedHistory(ValueCallback<String[]> callback) {
// called during webview initialization, original implementation does strictly nothing 
// and defaults to the native method WebViewCore.nativeProvideVisitedHistory()
            String[] myUserHistory = getVisitedUrlsFromMyOwnDatabase(userId);
            callback.onReceiveValue(myUserHistory);
        }
    };
WebViewClient myWebViewClient = new WebViewClient(){
    @Override
public void doUpdateVisitedHistory(WebView view, String url,
        boolean isReload) {
// called whenever there is a new link being visited
        insertIfNotExistVisitedUrlIntoMyOwnDatabaseForUser(userId);
        super(view, url, isReload);
}
}
webView.setWebViewClient(myWebViewClient);
webView.setChromeClient(myWebChromeClient);
webView.getSettings().etc(whatever)...
Run Code Online (Sandbox Code Playgroud)

我想我“快到了”。这是我管理的部分:到目前为止,它所做的是完全删除 CSS 历史记录,所以我们已经完成了一半。我无法让浏览器识别我在“myUserHistory”中提供的 url 格式,因此实际上此代码所做的唯一功能是完全重置 css 历史记录,但仅在实例化(或创建 WebView)时调用一次,没有检查),因此为了获得真正的多用户体验,您需要在每次登录时重新创建 Web 视图。

我现在的问题是我无法正确加载 urlHistory。我的 Honeycomb Xoom webview 似乎忽略了我的数据。啊,好吧,我希望它对你有用。对我来说,只需调用callback.onReceiveValue(new String[]{}); 在 getVisitedHistory() 中就足够了。

编辑:我只是花了二十分钟,因为我很好奇。此方法委托给 WebChromeClient (mCallbackProxy = WebChromeClient)。

protected void populateVisitedLinks() {
     ValueCallback callback = new ValueCallback<String[]>() {
         public void onReceiveValue(String[] value) {
             sendMessage(EventHub.POPULATE_VISITED_LINKS, (Object)value);
         }
     };
     mCallbackProxy.getVisitedHistory(callback);
 }
Run Code Online (Sandbox Code Playgroud)

它在 WebViewCore 中受到保护,这是 WebView 的私有属性,没有访问器。sendMessage 委托给私有的 EventHub,而 WebViewCore 充满了私有的本机方法,其中之一似乎是在初始化期间实际调用 populateVisitedLinks() 方法的方法。

除非 Google 的某人向 WebView 添加一个公共方法来触发重新填充,否则恐怕几乎不可能实现您的目标。对不起 :(

顺便说一句,所有这些本地访问历史记录处理确实让我想知道:为什么硬件制造商如此关心我们访问了哪些网址?;) <<< 讽刺