Как очистить (CSS) посещенную историю Android WebView? - PullRequest
15 голосов
/ 13 мая 2011

Я пытаюсь повторно использовать существующий WebView, удаляя любые личные данные, оставленные предыдущим пользователем:

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

clearHistory, кажется, очищает только список назад / вперед, доступный через API, но не внутренний список, используемый для окрашивания ссылок внутри веб-контента.

Я даже попробовал следующее, предложенное другим stackoverflow ответом :

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

Мне все еще не повезло: CSS :visited селекторы все еще работают после перезагрузки страницы.

Альтернативой может быть использование функции частного просмотра API уровня 11 (аргумент нового конструктора), но тогда я вообще не смогу воспользоваться посещенными ссылками; и больше не может предназначаться для более старых версий.

Может, у кого-то есть решение этой проблемы? Спасибо за вашу помощь.

Резюме ответов, которые я получил до сих пор:

Я попробовал эти два ответа, но первый, кажется, очищает хранилище данных HTML5, а последний, похоже, специфичен для встроенного браузера:

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

WebChromeClient.getVisitedHistory(ValueCallback<String[]> callback) вызывается только после первого создания нового WebView в недавно установленном приложении.

Я пытался удалить WebView из иерархии представления и создать новый, но, к сожалению, посещенная история, похоже, сохраняется для всего приложения.

Ответы [ 4 ]

3 голосов
/ 22 мая 2011

Переопределить 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, так что мы на полпути.Я не могу заставить браузер распознавать формат URL, который я предоставляю в «myUserHistory», поэтому, по сути, единственная функция, которую выполняет этот код, - полностью сбрасывать историю CSS, но он вызывается только один раз, когда создается WebView (или создается).не проверял), поэтому для истинного многопользовательского опыта вам нужно будет заново создавать веб-просмотр при каждом входе в систему.

Моя проблема сейчас заключается в том, что мне не удается правильно загрузить urlHistory.Мой веб-просмотр Honeycomb Xoom, похоже, игнорирует мои данные.Ах, хорошо, я надеюсь, что это работает для вас.Для меня просто вызов 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 мы посетили?;) <<< sarcasm </p>

1 голос
/ 22 мая 2011

Если вы можете получить экземпляр Browser (может быть, вы можете установить WebChromeClient на WebView), вы можете использовать его clearHistory() метод.

1 голос
/ 16 мая 2011

В качестве альтернативного решения, вы можете попробовать добавить свой собственный 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 голосов
/ 20 мая 2011

Имеет ли WebStorage.clearAllData() желаемый эффект? К сожалению, документация для этого класса очень скудна по сравнению с WebView и не говорит, применима ли она к WebViews.

Точное время, когда вы звоните clearHistory(), также может оказать влияние. Очистка и последующая навигация по новой странице могут по-прежнему сохранять первую страницу в истории, и вам необходимо вызвать метод после загрузки новой страницы .

Лично, если конфиденциальность является реальной проблемой, я бы по возможности создал новый набор объектов для этого нового сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...