2011-05-13 5 views
15

나는 이전 사용자가 뒤에 남아있는 개인 데이터를 삭제하여 기존 웹보기를 다시 사용하려고 :Android WebView의 (CSS) 방문 기록을 삭제하는 방법은 무엇입니까?

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

clearHistory이 API를 통해 액세스 할 뒤로/앞으로 목록을 삭제 만 보인다,하지만하지 내부 목록은 착색에 사용 웹 콘텐츠 내부의 링크. 나는 그래도 문제가 해결되지

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

: CSS :visited 선택기는 여전히 페이지를 다시로드 한 후 작동

나는 심지어 다른 stackoverflow answer에 의해 제안 다음을 시도했다.

다른 방법으로는 API 레벨 11 개인용 브라우징 기능 (새로운 생성자 인수)을 사용하는 것이지만 방문한 링크는 전혀 도움이되지 않습니다. 더 이상 이전 버전을 타겟팅 할 수 없습니다.

누군가이 문제에 대한 해결책을 갖고 있습니까? 당신의 도움을 주셔서 감사합니다.

나는이 두 가지 답변을했지만, 첫 번째 HTML5 데이터 저장을 취소 보인다 후자는 내장 된 브라우저에 고유 한 것 같다 : 답변의

요약 지금까지 가지고

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

WebChromeClient.getVisitedHistory(ValueCallback<String[]> callback)은 최근에 설치된 응용 프로그램에서 새 WebView를 처음 만든 후에 만 ​​호출됩니다.

보기 hierachy에서 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()에서 충분할 것입니다.

편집 : 궁금해서 20 분 더 넣습니다. 이 메서드는 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는 private 인 EventHub에 위임하며 WebViewCore는 private 네이티브 메소드로 채워져 있으며 그 중 하나는 초기화 중에 실제로 populateVisitedLinks() 메소드를 호출하는 것으로 보입니다.

Google의 누군가가 WebView에 공개 메소드를 추가하여 재생산을 트리거하지 않으면 목표를 달성하는 것이 사실상 불가능합니다. 죄송합니다 :(보조 노트로

, 모든 기본 방문 기록 처리는 정말 나에게 놀라운 일을한다 : 왜 하드웨어 제조업체는 우리가 방문한 URL에있는에 대해 너무 많이 걱정하지) < < < 풍자

+0

노력을 가져 주셔서 감사합니다. 저는이 아이디어가 마음에 들지만,이 문제는 'getVisitedHistory'가 모든 페이지로드에서 호출되지 않는다는 것입니다. 어쨌든'getVisitedHistory'의 호출이 어떻게 든 강제 될 수 있는지 확인하는 노력이 필요할 것입니다. – Nappy

+0

방금 ​​문제에 대한 개인적인 생각으로 답변을 업데이트했습니다. –

1

다른 해결책으로, 기본 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;} 
+0

나는대로 웹보기를 사용할 수 있습니까? 브라우저. 사용자는 어디에서나 탐색 할 수 있습니다. – Nappy

0

WebStorage.clearAllData()는 원하는 효과를 가지고 있습니까? 죄송 합니다만이 클래스의 documentation은 매우 희박하며 WebView과 비교되며 WebView에 적용되는지 여부는 밝혀지지 않습니다.

clearHistory()라고하는 정확한 시간이 효과가있을 수 있습니다. 지우고 새 페이지로 이동하면 기록의 첫 번째 페이지가 유지 될 수 있으므로 after the new page has loaded 메서드를 호출해야합니다.

개인적으로 프라이버시가 진짜 문제라면 가능한 한이 새로운 세션을 위해 처음부터 새로운 개체 집합을 만듭니다. 당신이 Browser 인스턴스를 얻을 수있는 경우

1

당신이 clearHistory() 방법을 사용할 수 있습니다 (어쩌면 당신은 WebChromeClientWebView에 설정할 수 있습니다).

관련 문제