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

Java 如何清除Android WebView的(CSS)访问历史记录?,java,android,css,caching,Java,Android,Css,Caching,我试图通过清除前一个用户留下的任何私有数据来重用现有WebView: CookieManager.getInstance().removeAllCookie(); webview.clearHistory(); webview.clearFormData(); webview.clearCache(true); clearHistory似乎只清除可通过API访问的后退/前进列表,而不清除用于为web内容内的链接着色的内部列表 我甚至尝试了另一个建议: 我仍然没有运气:CSS:已访问的选择器在重

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

CookieManager.getInstance().removeAllCookie();
webview.clearHistory();
webview.clearFormData();
webview.clearCache(true);
clearHistory
似乎只清除可通过API访问的后退/前进列表,而不清除用于为web内容内的链接着色的内部列表

我甚至尝试了另一个建议:

我仍然没有运气:CSS
:已访问的
选择器在重新加载页面后仍然有效

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

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

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

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

WebStorage.getInstance().deleteAllData();
Browser.clearHistory(getContentResolver());
WebChromeClient.getVisitedHistory(ValueCallback回调)
仅在我第一次在最近安装的应用程序中创建新的WebView后调用


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

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

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

WebStorage.clearAllData()
是否达到预期效果?不幸的是,与
WebView
相比,这个类上的属性非常稀少,并且没有说明它是否适用于WebView

您调用
clearHistory()
的确切时间也可能有影响。清除它然后导航到一个新页面可能仍然会保留历史记录中的第一个页面,并且您必须调用该方法


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

如果您可以获得一个
浏览器
实例(也许您可以将
WebChromeClient
设置为
WebView
),您可以使用它的方法。

覆盖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)...
WebView-WebView=(WebView)findViewById(R.id.myWebView);
WebChromeClient myWebChromeClient=新WebChromeClient(){
@凌驾
public void getVisitedHistory(值回调){
//在webview初始化期间调用,原始实现完全不执行任何操作
//并默认为本机方法WebViewCore.nativeProviderItemHistory()
字符串[]myUserHistory=getVisitedUrlsFromMyOwnDatabase(用户ID);
onReceiveValue(myUserHistory);
}
};
WebViewClient myWebViewClient=新建WebViewClient(){
@凌驾
public void doUpdateVisitedHistory(WebView视图、字符串url、,
布尔值(isReload){
//在访问新链接时调用
在MyownDatabaseforUser(userId)中插入fNotExistedVisitedUrl;
超级(视图、url、isReload);
}
}
setWebViewClient(myWebViewClient);
setChromeClient(myWebChromeClient);
webView.getSettings()等(无论什么)。。。
我想我“快到了”。这里是我管理的部分:到目前为止,它所做的是完全删除css历史记录,所以我们已经完成了一半。我无法让浏览器识别我在“myUserHistory”中提供的url格式,因此实际上,这段代码的唯一功能是完全重置css历史记录,但它仅在Web视图实例化(或创建,未检查)时调用一次,因此要获得真正的多用户体验,您需要在每次登录时重新创建Web视图

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

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

受保护的void populateVisitedLinks(){
ValueCallback callback=新的ValueCallback(){
public void onReceiveValue(字符串[]值){
sendMessage(EventHub.POPULATE\u访问的链接,(对象)值);
}
};
mCallbackProxy.getVisitedHistory(回调);
}
它在WebViewCore中受保护,WebViewCore是WebView的私有属性,没有访问器。sendMessage委托给EventHub,后者是私有的,WebViewCore中充满了私有的本机方法,其中一个似乎是在初始化过程中实际调用populateVisitedLinks()方法的方法

除非谷歌有人在WebView中添加一个公共方法来触发重新填充,否则我担心这几乎不可能实现你的目标。对不起:(


顺便说一句,所有这些本地访问历史处理确实让我感到奇怪:为什么硬件制造商如此关心我们访问了哪些URL?;)我使用WebView作为浏览器。用户可以在任何地方导航。感谢您的努力,我喜欢这个想法,但问题是,
getVisitedHistory
并不是在每次页面加载时都被调用的(正如您已经说过的)。也许值得一试,看看是否可以强制调用
getVisitedHistory
。我刚刚用我个人的想法更新了我的答案。
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)...
protected void populateVisitedLinks() {
     ValueCallback callback = new ValueCallback<String[]>() {
         public void onReceiveValue(String[] value) {
             sendMessage(EventHub.POPULATE_VISITED_LINKS, (Object)value);
         }
     };
     mCallbackProxy.getVisitedHistory(callback);
 }