2011-05-13 180 views
15

我尝试通过清除以前的用户留下任何私人数据重用现有的WebView:如何清除Android WebView的(CSS)访问历史记录?

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

clearHistory似乎只是为了清除前进/后退清单,通过API访问,但用于着色不是内部列表网页内容的链接。

我甚至尝试以下,由另一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并创建一个新的,但不幸的是,被访问的历史似乎被存储为整个应用程序。

回答

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添加公共方法来触发重新填充,否则恐怕实现目标几乎是不可能的。对不起:(

作为一个侧面说明,所有这些本地访问历史记录的处理真的让我纳闷:为什么硬件制造商如此在意哪些URL我们走访;)< < <讽刺

+0

感谢您的努力,我喜欢这个想法,但问题在于,getVisitedHistory不会在每次加载页面时调用(如您已经声明的)。也许值得努力检查是否可以强制调用'getVisitedHistory'。 – Nappy 2011-05-23 08:32:25

+0

我刚刚用我个人的想法更新了我的回答。 – 2011-05-23 09:13:37

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;} 
+0

我使用的WebView作为?一个浏览器。用户可以在任何地方导航。 – Nappy 2011-05-16 08:21:35

0

WebStorage.clearAllData()是否具有预期的效果?不幸的是,该类的documentationWebView相比非常稀疏,并没有说明它是否适用于WebViews。

你打电话clearHistory()也可以有效果的确切时间。清除它,然后导航到新页面可能仍然保留历史上的第一页,并且您必须调用方法after the new page has loaded

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

1

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