一尘不染

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

java

我尝试通过清除先前用户留下的所有私有数据来重用现有的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从视图层次结构中删除该视图层次结构并创建一个新的层次结构,但是不幸的是,访问的历史记录似乎已存储在整个应用程序中。


阅读 346

收藏
2020-12-03

共1个答案

一尘不染

覆盖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
Web视图似乎忽略了我的数据。嗯,希望它对您有用。对我来说,只需调用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()方法的方法。

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

附带说明一下,所有这些本机访问的历史记录处理确实使我感到奇怪:为什么硬件制造商如此关心我们访问了哪些URL?;)

2020-12-03