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

2022-09-03 15:59:51

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

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

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

我甚至尝试了以下方法,这是另一个堆栈溢出答案所建议的:

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

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

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

也许有人有解决这个问题的方法?感谢您的帮助。

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

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

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

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

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


答案 1

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

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

我现在的问题是我无法设法正确加载urlHistory。我的Honeycomb Xoom网络视图似乎忽略了我的数据。啊,好吧,我希望它对你有用。对我来说,只需调用 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中受到保护,WebViewCore是WebView的私有属性,没有访问器。sendMessage 委托给 EventHub 是私有的,WebViewCore 充满了私有的本机方法,其中一个似乎是在初始化期间实际调用 populateVisitedLinks() 方法的方法。

除非谷歌的某个人在WebView中添加一个公共方法来触发重新填充,否则恐怕实际上不可能实现你的目标。对不起:(

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


答案 2

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

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

推荐