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

时间:2011-05-13 13:44:55

标签: java android css caching

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

CookieManager.getInstance().removeAllCookie();
webview.clearHistory();
webview.clearFormData();
webview.clearCache(true);

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

我甚至尝试了以下内容,由另一个stackoverflow answer建议:

deleteDatabase("webview.db");
deleteDatabase("webviewCache.db");

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

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

也许某人有解决此问题的方法?谢谢你的帮助。

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

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

WebStorage.getInstance().deleteAllData();
Browser.clearHistory(getContentResolver());

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

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

4 个答案:

答案 0 :(得分:3)

覆盖WebChromeClient和WebViewClient ......该死的是隐藏的。

我实际上不得不挖掘a bit才能找到它。

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)...

我想我“几乎就在那里”。这是我管理的部分:到目前为止它完全取消了css历史,所以我们就在那里。我无法让浏览器识别我在“myUserHistory”中提供的url格式,所以实际上这个代码的唯一功能是完全重置css历史记录,但是只有在WebView实例化(或创建时)时才调用它没有检查),因此要获得真正的多用户体验,您需要在每次登录时重新创建webview。

我现在的问题是我无法正确加载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);
 }

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

除非Google的某个人向WebView添加公共方法以触发重新填充,否则我担心实现目标几乎是不可能的。对不起:(

作为旁注,所有这些本地访问历史处理确实让我想知道:为什么硬件制造商如此关心我们访问过哪些网址? ;)&lt;&lt;&lt;讽刺

答案 1 :(得分:1)

作为替代解决方案,您可以尝试使用默认CSS具有的相同基色添加自己的CSS,并在要重置访问时重置另一个CSS(两种“类型”链接的颜色相同)链接。

A:link{color: "#990000"; text-decoration: none;}
A:visited{color: "#990000"; text-decoration: none;}
A:hover{color: "#ff0000"; text-decoration: none;}

答案 2 :(得分:1)

如果您可以获得Browser个实例(也许您可以将WebChromeClient设置为WebView),则可以使用其clearHistory()方法。

答案 3 :(得分:0)

WebStorage.clearAllData()是否具有预期的效果?不幸的是,与WebView相比,此类上的documentation非常稀疏,并且没有说明它是否适用于WebView。

您致电clearHistory()的确切时间也可能有效。清除它然后导航到新页面可能仍然保留历史记录中的第一页,您必须调用方法after the new page has loaded

就个人而言,如果隐私是一个真正的问题,我会尽可能从头开始为这个新会话创建一组新对象。