2011-05-13 89 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()方法。